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