大家在使用C++寫操作文件的程序時,一定使用過eof()這個函數,用它來判別文件結束,但有不少也用來判別文件是否為空的.但是,這樣操作的結果不是我們所想的.看下面程序:
#include?<string>

using?namespace?std;

int?main()


{
????char?c?=?'c';
????ifstream?FILE("test.txt");
????if?(FILE.eof())
????????cout?<<?"文件是空的."<<endl;exit(1);?

????while?(!FILE.eof())

????
{
????????FILE.get(c);
????????cout?<<?c;
????}????
????system("pause");
????return?0;
}


?ifstream?FILE("test.txt",ios::in|ios::binary);
????if?(FILE.eof())
????????cout?<<?"文件是空的."<????while?(!FILE.eof())

????
{
????????FILE.read(&c,1);
????????cout?<<?c;
????}//代碼其他部分相同

#include?<iostream.h>
#include?<stdlib.h>
#include?<fstream.h>

int?main()


{
????char?c?=?'c';
????ifstream?FILE("test.txt");
????if?(FILE.peek()?==?EOF)//修改?

????
{
????????cout?<<?"文件是空的."<<?endl;?
????????exit(1);
????}???????
????while?(FILE.peek()?!=?EOF)//修改

????
{
????????FILE.get(c);
????????cout?<<?c;
????}????
????system("pause");
????return?0;
}


























當test.txt為空文件時,它輸出的是:c
奇怪!應該輸出是:文件是空的. while里面的操作也應該不用到的.但是結果偏偏和我們所想的相反.
好,那操作二進制文件又是怎樣的呢?修改下為:
???










結果輸出還是c..噢!!怎么會這樣的.分明是騙人的東西嘛!!到底是什么原因呢?
???? 經過一段研究后,原來eof()返回true的條件是"讀到文件結束符",而不是文件內容的最后一個字符。
要清楚"文件結束符"(0xff).就是說我們文件最后的字符不是文件結束符,而最后的字符的下一位才是.所以操作再讀多一次.就為什么上面if (FILE.eof())總是false的. 在一些編譯器中(dev c++),它讀到最后一個字符后文件位置的指針會定在那兒,所以就會重復最后一個字符.?????
??? 在一個外國的CPP論壇見到一位同志的代碼剛好有這解決方法.現在把上面的代碼改為下面的:




























主要的是把eof()改為peek() == EOF來判別,其中peek()是取文件當前指針,EOF是文件尾標符,它的值為-1.所以采用這種方法就解決上面eof()的問題了..這種方法也可以用在讀寫二進制文件中.
@Linuxayn
@秦歌
Returns the next character to be read.
博主這樣胡說一通會誤人。
feof() eof()在上一次讀入時候出現錯誤的時候被設置成TRUE,peek就有這個作用。