为什么这个C代码有问题?

在另一个问题上 , Jerry Coffin指出了以下内容:

它(可能)与你的问题并不真正相关,但是while (!feof(fileptr)){几乎是一个有保障的bug。

我想我会开始一个单独的问题,因为这个评论有些偏离主题。 有人可以向我解释一下吗? 这是我以前用C编写的第一个程序。

这句话的原因是,当文件结束时, feof仍然(最初)为假 – 只有在第一次尝试读取超过文件末尾的失败后才会变为真。

于是

 char mychar; while(!feof(fileptr)) { fread(&mychar, sizeof(char), 1, fileptr); fprintf(stderr, "The char is '%c'.\n", mychar); } 

将处理一个char太多。

正确的方法是检查fread的返回值(或者你用来读取的任何函数),或者执行读取的函数之后调用feof 。 例如:

 char mychar; while(fread(&mychar, sizeof(char), 1, fileptr) > 0) fprintf(stderr, "The char is '%c'.\n", mychar); 

Google发现了这一点: http : //www.drpaulcarter.com/cs/common-c-errors.php#4.2

它说:“作者还没有看到任何学生正确使用feof()函数!”

总而言之,C文件的function类似于freadfwrite返回状态值,无论如何你不应该忽略 。 检查feof的价值是在马已经逃离之后用螺栓固定门的其中一个。

C FAQ列表的答案以及许多其他常见问题的答案:

在C中,只有在输入例程尝试读取并失败后才会指示文件结束。