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