下面的代码,当用g ++编译和运行时,打印'1'两次,而我希望'1'只打印一次,因为我将一个结构转储到文件中,但回读时它似乎是读取两个结构.为什么?
#include#include 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(); }
Eclipse.. 11
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,这将阻止它进入循环.
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,这将阻止它进入循环.
您的while循环正在执行两次,因为在第一次尝试读取超出文件末尾之前,EOF条件不成立.所以cout执行两次.