c/c++里的eof函數(shù)碰到讀多了一次的問題的解決方法
有不少人用eof函數(shù)碰到讀多了一次的問題,但凡c/c++里的eof函數(shù),比如feof,fstream對象的eof函數(shù)等等,都是相同的原理。
還原一下現(xiàn)場:
#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; }
運行會發(fā)現(xiàn)寫了6個3進去,打開文件看也是6個3,但是讀卻讀了7個出來。
這主要是eof標志延遲了。eof主要是根據(jù)eofbit來確定返回值的:
bool?eof() { if(eofbit) return?true; else?return?false; }
而eofbit是在讀取中設置的,讀取到最后一次時,eofbit仍然為false;到下一次讀取失敗后,它才更新eofbit為true,也就是說要犯一次錯才知道。在這嘗試讀取中,讀取失敗,所以k還是上一次的值。
因此,一般都是直接把讀取語句放在while循環(huán)里面。
#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函數(shù),那么就先讀取一次。
#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語言中的函數(shù)也是類似這樣子。