fstream读取数据避坑(总是多读取一条记录的问题)
最近遇到的问题,在向文件写入如下数据,并且再次读取的时候,总是莫名其妙的多显示一条数据。
数据结构如下,保存在data.txt文件中:
class Data
{
public:
char isbn[100];
char title[100];
int price;
Data()
{
for (int i = 0; i < 100; i++)
{
isbn[i] = '\0';
title[i] = '\0';
}
}
};
最初的读取代码如下
fstream file;
file.open("data.txt", ios::in | ios::binary);
......
Data d;
while (!file.eof())
{
file.read(d.title, 100);
file.read(d.isbn, 100);
file.read(reinterpret_cast<char *>(&d.price), sizeof(int));
cout << d.title << "\t";
cout << d.isbn << "\t";
cout << d.price << endl;
}
file.close();
...
结果发现每次读取数据都会多出来一条数据。百度一下,据说是读取最后一条数据后,read并不会设置eofbit为true,因此file.eof()仍然是false,这时候仍然会再次读取数据。 既然如此,改动代码如下(注意判断语句的位置很重要):
......
while (true)
{
file.read(d.title, 100);
file.read(d.isbn, 100);
file.read(reinterpret_cast<char *>(&d.price), sizeof(int));
if(file.eof())
break;
cout << d.title << "\t";
cout << d.isbn << "\t";
cout << d.price << endl;
}
file.close();
......
这样子的话,在read最后一条数据后,再次进入循环,read读取不到数据,就会设置eofbit,从而忽略后面的cout.
更为简单的办法就是把while的判断条件改为(file.peek()!=EOF)即可,peek函数用于读取并返回下一个字符,但并不提取该字符到输入流中.

浙公网安备 33010602011771号