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;
}
運(yùn)行會(huì)發(fā)現(xiàn)寫了6個(gè)3進(jìn)去,打開文件看也是6個(gè)3,但是讀卻讀了7個(gè)出來。
這主要是eof標(biāo)志延遲了。eof主要是根據(jù)eofbit來確定返回值的:
bool?eof()
{
if(eofbit)
return?true;
else?return?false;
}而eofbit是在讀取中設(shè)置的,讀取到最后一次時(shí),eofbit仍然為false;到下一次讀取失敗后,它才更新eofbit為true,也就是說要犯一次錯(cuò)才知道。在這嘗試讀取中,讀取失敗,所以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ù)也是類似這樣子。





