为什么这个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类似于fread
和fwrite
返回状态值,无论如何你 。 检查feof
的价值是在马已经逃离之后用螺栓固定门的其中一个。
C FAQ列表的答案以及许多其他常见问题的答案:
在C中,只有在输入例程尝试读取并失败后才会指示文件结束。