xshbx 发表于 2009-9-29 12:43:09

使用C/C++进行文件读取时,如何正确判断文件是否结束?

在使用C/C++进行文件读取时,经常需要判断文件是否结束。这时相信大家会想到使用iostream的成员函数eof()。这个函数如果到达相关联的输入文件的末尾,eof()函数返回true,否则返回false。但是在使用这个函数时可能会出现一点小问题。先看下面一个例子。
//文件拷贝实例
#include <iostream>
#include <fstream>

int main() {
char ch;
ifstream fin("org.txt" , ios::binary);
ofstream fout("new.txt",ios::binary);


while (!fin.eof()) {
fin.get(ch);
fout.put(ch);
}
return 0;
}

这是一个打算实现文件拷贝的程序,但是结果是拷贝的new.txt与源文件有差别,会比原文件稍大,可以使用DOS下的fc命令比较。现在我们来分析一下程序的执行过程。eof()返回true时是读到文件结束符0xFF时,而不是在读取了文件的最后一个字符时。在while循环中当读取了文件的最后一个字符后,fin.eof()仍为false,所以会紧接着再读取一个字符,所以拷贝的文件会比源文件多一个字符(文件结尾符),这可能在大多数情况下并不影响文件的使用,但是毕竟不能让人放心。
正确的判断方式是使用fin.peek()!=EOF,peek()是读取文件的下一个字符。

sleepyscorpio 发表于 2009-9-29 12:59:19

楼主的用法有点问题,正常情况下在get()以后是需要检查eofbit, failbit 和 badbit的,通常是实用good()来做这个检查。所以上面的代码应该改为:

while(!fin.eof()){
fin.get(ch);
if(fin.good()) fout.put(ch);
}

armok 发表于 2010-1-26 11:38:17

页: [1]
查看完整版本: 使用C/C++进行文件读取时,如何正确判断文件是否结束?