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函数用于读取并返回下一个字符,但并不提取该字符到输入流中.

posted @ 2021-03-26 15:55  大神的老爸  阅读(637)  评论(0)    收藏  举报