代碼走起來:
```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");
}
結果: