大家在使用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()的问题了..这种方法也可以用在读写二进制文件中.