1. 程式人生 > >C++結構體讀寫操作

C++結構體讀寫操作

    今天再寫一個練手的程式的時候,忘記了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;
	}
}

這是進行讀的操作:

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
}
    程式碼是在VS2017上執行通過的,通過上述方式可以進行結構體的檔案讀寫操作,要注意eof()函式的效果並不是我們想要的那樣,會導致程式產生一個多餘的無效節點,所以在最後要把多餘的讀取的無效節點消除掉。