您的位置:首页 > 其它

文件操作EOF的问题

2012-01-09 22:10 176 查看
大家在使用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()的问题了..这种方法也可以用在读写二进制文件中.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: