C++基礎之文件讀寫重複問題

代碼走起來:


```cpp
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<fstream>
using namespace std;

class teacher{
private:
	char name[20];
	int age;
public:
	teacher()
	{
		strcpy(name, "tangyong");
		age = 23;

	}
	teacher(char *n, int a)
	{
		strcpy(name, n);
		age = a;
	}
	void print()
	{

		cout << "age:" << age << "name:" << name << endl;
	}
};

static char *filename = "C:\\Users\\sotn\\Desktop\\12.txt";
static char buf[] = "\n";
void writedata()
{
	teacher t1("TY", 22), t2("tangyong", 23);
	teacher t3("TY_1", 22), t4("tangyong_1", 24);

	ofstream fp(filename, ios::binary | ios::app);//二進制方式打開適合類中的對象
	if (!fp)
	{
		cout << "文件打開失敗\n";
		exit(0);
	}
	
	
	fp.write((char *)&t1, sizeof(t1));
	fp.write(buf, sizeof(buf));
	fp.write((char *)&t2, sizeof(t2));
	fp.write(buf, sizeof(buf));
	fp.write((char *)&t3, sizeof(t3));
	fp.write(buf, sizeof(buf));
	fp.write((char *)&t4, sizeof(t4));
	fp.write(buf, sizeof(buf));
	fp.close();

}

void readData()
{
	//方法1:每次都多讀了最後一行
	/*ifstream fin(filename);
	teacher temp;
	while (!fin.eof())
	{
		fin.read((char *)&temp, sizeof(teacher));
		temp.print();
		fin.read(buf, sizeof(buf));
		cout << buf;

	}
fin.close();
*/

	//方法2:解決了方法1中的問題

	ifstream fin(filename);
	teacher temp;
	while (fin.peek() != EOF)
	{
		fin.read((char *)&temp, sizeof(teacher));
		temp.print();
		
		fin.read(buf, sizeof(buf));
		cout << buf;

	}
	fin.close();

	/*
	關於peek()
	peek放回輸入流中下一個字符的副本,但不會將它從流中刪除,peek返回的值仍然留在流中。
	EOF表示文件的結束
	所以使用第一種方法的時候,讀完最後一條記錄的時候沒有指向EOF,
	假設文件有內容 aaaa,bbbb,cccc,dddd那結構如下:
	aaaa
	bbbb
	cccc
	dddd
	EOF
	那我們改進方法1,每次讀完之後都在判斷一下
	
	*/


}
void main()
{
//	writedata();
	
	readData();
	remove(filename);
	
	system("pause");
}

結果:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章