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

时间:2009-10-19 12:12:00

标签: c file-io while-loop feof

another question上,Jerry Coffin指出了以下内容:

  

它(可能)与你的问题没有关系,但while (!feof(fileptr)){几乎是一个有保证的错误。

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

3 个答案:

答案 0 :(得分:9)

这句话的原因是,当文件结束时,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);

答案 1 :(得分:5)

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

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

总而言之,C文件的功能如freadfwrite无论如何都会返回状态值< blink>不应忽略< / blink> 。检查feof的值是在马已经逃离之后用螺栓固定门的其中一个。

答案 2 :(得分:1)

C FAQ列表中包含answer以及许多其他此类常见问题的答案:

  

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