代码走起来:
```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");
}
结果: