C++結構體讀寫操作
阿新 • • 發佈:2018-11-04
今天再寫一個練手的程式的時候,忘記了C++關於結構體的檔案讀寫操作,於是在網上找了好多,但是都是有些問題的,經過一番探索終於解決了在檔案中讀寫結構體的問題,下面就是我的解決方法。
首先程式裡要用到ifstream的eof()函式,以及open()函式開啟檔案,底下的就是我的程式碼。
typedef struct tagStudent { char szName[20]; //姓名 char szSex[4]; //性別 int nAge; //年齡 int nStuNo; //學號 int nScore; //成績 tagStudent* next; }Student; typedef struct tagHead { int n; //學生數量 Student* first; }Head;
這是兩個結構體的定義,主要是Student結構體,是對它進行讀寫操作,第二個結構體僅僅是為了我的程式方便。
這是進行寫的操作:
void Write(Head* head)//儲存資訊 { ofstream outfile; if (hasRead) { outfile.open("C:\\Users\\jky\\Desktop\\StudentManager.txt", fstream::out); //以覆蓋的方式開啟檔案 if (!outfile.is_open()) cerr << "File open error::OUT" << endl; } else { outfile.open("C:\\Users\\jky\\Desktop\\StudentManager.txt", fstream::app); //以追加的方式開啟檔案 if (!outfile.is_open()) cerr << "File open error::OUT2" << endl; } Student *p = head->first->next; while (p != NULL) { outfile << p->szName << ' ' << p->szSex << ' '; outfile << p->nAge << ' ' << p->nStuNo << ' ' << p->nScore << ' '; //將結構體寫入檔案用空格隔開每個小內容 p = p->next; } }
這是進行讀的操作:
程式碼是在VS2017上執行通過的,通過上述方式可以進行結構體的檔案讀寫操作,要注意eof()函式的效果並不是我們想要的那樣,會導致程式產生一個多餘的無效節點,所以在最後要把多餘的讀取的無效節點消除掉。void ReadStudent(Head* head)//讀取資訊 { ifstream readFile; readFile.open("C:\\Users\\jky\\Desktop\\StudentManager.txt", fstream::in); if (!readFile.is_open()) { cerr << "File open error::IN" << endl; } Student *p = head->first, *q; while (p->next != NULL) p = p->next; while (!readFile.eof())//注意eof()函式會導致多讀取一個結構體,後面給出處理 { q = new Student; readFile >> q->szName >> q->szSex >> q->nAge >> q->nStuNo >> q->nScore; // >>操作符會自動忽略回車和空格符 q->next = NULL; p->next = q; p = p->next; } p = head->first; while (p->next->next != NULL) p = p->next; delete p->next; //刪除多讀出的無效節點 p->next = NULL; //將無效節點上一個節點的next指標置為NULL }