大家在使用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;
}


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

?ifstream?FILE("test.txt",ios::in|ios::binary);
????
if?(FILE.eof())
????????cout?
<<?"文件是空的."<????while?(!FILE.eof())
????
{
????????FILE.read(
&c,1);
????????cout?
<<?c;
????}
//代碼其他部分相同

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

#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;
}

主要的是把eof()改為peek() == EOF來判別,其中peek()是取文件當前指針,EOF是文件尾標符,它的值為-1.所以采用這種方法就解決上面eof()的問題了..這種方法也可以用在讀寫二進制文件中.