|
在使用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()是读取文件的下一个字符。 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|