C++结构体读写操作

    今天再写一个练手的程序的时候,忘记了C++关于结构体的文件读写操作,于是在网上找了好多,但是都是有些问题的,经过一番探索终于解决了在文件中读写结构体的问题,下面就是我的解决方法。

    首先程序里要用到ifstream的eof()函数,以及open()函数打开文件,底下的就是我的代码。

struct Student
{
	int number;
	char name[20];
	char sex[5];
	char age;
	double score;
	Student *next;
};

struct Head
{
	int nStudent;
	Student *first;
};

这是两个结构体的定义,主要是Student结构体,是对它进行读写操作,第二个结构体仅仅是为了我的程序方便。

这是进行写的操作:

void writeStudent(Head *head)
{
	Student *p = head->first->next;
	if (p == NULL)
		return;
	ofstream outFile;
	outFile.open("C:\\Users\\jky\\Desktop\\File\\file\\StudentManager.txt",ofstream::out);
	if (!outFile.is_open())
		cout << "Open File Error" << endl;
	while (p != NULL)
	{
		outFile << p->number << " " << p->name << " " << p->sex << " " << p->age << " " << p->score << " ";
		p = p->next;
	}
	outFile.close();
}

这是进行读的操作:

void readStudent(Head *head)
{
	ifstream readFile;
	readFile.open("C:\\Users\\jky\\Desktop\\File\\file\\StudentManager.txt", fstream::in);
	if (!readFile.is_open())
		cerr << "Read File Error" << endl;
	Student *p = head->first;
	while (p->next != NULL)
		p = p->next;
	//eof()函数会导致多余生成一个student,在最后需要删掉。这是由于C++ eof()函数返回true时是读到        
	//文件结束符0xFF,而文件结束符是最后一个字符的下一个字符。于是最后一个节点就是有内存没内容
	while (!readFile.eof())
	{
		Student *newStu = new Student;
		readFile >> newStu->number >> newStu->name >> newStu->sex >> newStu->age >> newStu->score;
		newStu->next = NULL;
		p->next = newStu;
		p = p->next;
		head->nStudent++;
	}
	readFile.close();

	//删除多余的那个节点
	p = head->first;
	while (p->next->next != NULL)
		p = p->next;
	delete p->next;
	p->next = NULL;//将最后一个节点的next置为NULL
	head->nStudent--;
}

    代码是在VS2017上运行通过的,通过上述方式可以进行结构体的文件读写操作,要注意eof()函数的效果并不是我们想要的那样,会导致程序产生一个多余的无效节点,所以在最后要把多余的读取的无效节点消除掉。

 

你可能感兴趣的:(C++,文件操作)