!=EOF 和 !feof() 的差别
作者:Hily 原始链接:http://hily.me/blog/2004/11/c-eof-feof/
版权声明:可以转载,转载时务必以超链接形式标明文章原始出处和作者信息及版权声明
用 C 写了一个读文件的函数,读普通文本没有问题,可是当读取一些二进制文件时就出现问题了--函数总是没法把文件的所有内容读出来。
郁闷了两天,终于找到答案。
原程序:
void bFile2str(String fpath, String& rStr){
FILE* infile;
infile = fopen (fpath.c_str(), "rb");
if (infile == NULL) {
MessageBox(NULL, "Fail to open file, please check your path ..." , "Error" , MB_ICONWARNING);
return;
}
char cTemp;
int i=1;
cTemp = fgetc(infile);
while (cTemp != EOF) {
rStr = rStr + " ";
rStr[i] = cTemp;
cTemp = fgetc(infile);
i ++;
}
fclose(infile);
}
后来改成:
void bFile2str(String fpath, String& rStr){
FILE* infile;
infile = fopen (fpath.c_str(), "rb");
if (infile == NULL) {
MessageBox(NULL, "Fail to open file, please check your path ..." , "Error" , MB_ICONWARNING);
return;
}
char cTemp;
int i=1;
cTemp = fgetc(infile);
while (!feof(infile)) {
rStr = rStr + " ";
rStr[i] = cTemp;
cTemp = fgetc(infile);
i ++;
}
fclose(infile);
}
分析: 分析有误,请看评论。
EOF 是文件结束符,当 fgetc 读字符时遇到文件结束符时, 将返回一个文件结束标志 EOF(即-1)。如果是普通文本,当然可以用EOF来判断是否已到文件尾,但在二进制文件中可能包含多个 EOF 标志符,这时就会出现文件还没读完就被认为文件已经结束的情况。而 feof() 就解决了这个问题,它可以用来测试当前文件指针是否在文件尾,它和 EOF 的机理完全不同,当然会跳过中间的许多 EOF 字符。
-- EOF --


bughou 说道:
2009年02月12日 23:51
根本没有什么文件结束符。
如果有的话空文件不是还要占一个字节的结束符?
EOF是什么?它就是-1。它不过是C例程里的一个常量,当碰到文件结尾时,就返回-1。
问题的根本是你错误的认为磁盘的文件结尾还有一个字符专门表示文件的结束,呵呵,没有这个字符,你想啊,每读一个字符还要比较一下它是否等于“空想的文件结束符“,是不是太低效了点呢。那是如何判断文件是否已经结束的?中断、异常。
hilyjiang 说道:
2009年02月13日 11:33
to bughou:
你说的没有错,这篇文章是刚学编程时写的,确实有错误。
误人子弟呀,呵呵。