以下代码在通过g++编译并运行后,
打印两次“1”,而我希望打印“1”
仅一次,因为我将单个结构转储到
文件,但在回读时似乎是
阅读两个结构。为什么?

#include <iostream.h>
#include <fstream.h>

int main(){
    struct student
    {
        int rollNo;
    };
    struct student stud1;
    stud1.rollNo = 1;

    ofstream fout;
    fout.open("stu1.dat");
    fout.write((char*)&stud1,sizeof(stud1));
    fout.close();

    ifstream filin("stu1.dat");
    struct student tmpStu;
    while(!filin.eof())
    {
          filin.read((char*)&tmpStu,sizeof(tmpStu));
      cout << tmpStu.rollNo << endl;
    }
    filin.close();
}

最佳答案

eof仅在读取失败后设置,因此读取运行两次,第二次,它不会修改缓冲区。

试试这个:

while(filin.read((char*)&tmpStu,sizeof(tmpStu)))
{
    cout << tmpStu.rollNo << endl;
}

要么
while(!filin.read((char*)&tmpStu,sizeof(tmpStu)).eof())
{
    cout << tmpStu.rollNo << endl;
}

Read在调用时返回对filin的引用,如果流仍然良好,则引用的评估结果为true。当读取操作无法读取更多数据时,引用将评估为false,这将阻止其进入循环。

关于c++ - C++文件处理(结构),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/440167/

10-10 19:22