c/c++里的eof函数碰到读多了一次的问题的解决方法
扫描二维码
随时随地手机看文章
有不少人用eof函数碰到读多了一次的问题,但凡c/c++里的eof函数,比如feof,fstream对象的eof函数等等,都是相同的原理。
还原一下现场:
#include#includeusing namespace std; int main() { fstream out; out.open("test.txt",ios::out); int k=3; for(int i=0;i<6;i++) out<<k<<" "; out.close(); out.open("test.txt",ios::in); while(!out.eof()) { out>>k; cout<<k<<endl; } out.close(); return 0; }
运行会发现写了6个3进去,打开文件看也是6个3,但是读却读了7个出来。
这主要是eof标志延迟了。eof主要是根据eofbit来确定返回值的:
bool eof() { if(eofbit) return true; else return false; }
而eofbit是在读取中设置的,读取到最后一次时,eofbit仍然为false;到下一次读取失败后,它才更新eofbit为true,也就是说要犯一次错才知道。在这尝试读取中,读取失败,所以k还是上一次的值。
因此,一般都是直接把读取语句放在while循环里面。
#include#includeusing namespace std; int main() { fstream out; out.open("test.txt",ios::out); int k=3; for(int i=0;i<6;i++) out<<k<<" "; out.close(); out.open("test.txt",ios::in); while(out>>k) { cout<<k<<endl; } out.close(); return 0; }
如果一定要用eof函数,那么就先读取一次。
#include#includeusing namespace std; int main() { fstream out; out.open("test.txt",ios::out); int k=3; for(int i=0;i<6;i++) out<<k<<" "; out.close(); out.open("test.txt",ios::in); //here out>>k; while(!out.eof()) { out>>k; cout<<k<<endl; } out.close(); return 0; }
c语言中的函数也是类似这样子。