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

Why is this C code buggy?

提问人:Jason Baker 提问时间:10/19/2009 最后编辑:CommunityJason Baker 更新时间:10/20/2009 访问量:849

问:

关于另一个问题Jerry Coffin指出了以下几点:

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

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

C file-io while-loop 函数

评论


答:

5赞 user181548 10/19/2009 #1

谷歌发现这个:http://www.drpaulcarter.com/cs/common-c-errors.php#4.2

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

总而言之,C 文件的功能类似于并返回状态值,无论如何您<blink>不应忽略</blink>。检查的价值是那些在马已经逃跑后闩上马厩门的人之一。freadfwritefeof

评论

1赞 San Jacinto 10/19/2009
在您的答案中给出链接的简短概要。它使您的答案对搜索引擎更有价值。
2赞 10/19/2009
令人难以置信的巧合是,当我收到您的评论通信时,我正在这样做。
1赞 Jason Baker 10/19/2009
@Kinopiko - 头韵很棒。
2赞 10/19/2009
这现在是谷歌上最热门的“在马已经逃跑后闩上马厩门”,这对于 18 分钟前发布的东西来说还不错。
9赞 Martin B 10/19/2009 #2

此语句的原因是,当到达文件末尾时,它仍然(最初)为 false——只有在第一次尝试读取文件末尾失败后,它才会变为 true。feof

因此

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

将处理一个字符太多。

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

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

评论

0赞 William Pursell 10/19/2009
Nit:问题不在于循环读取一个字符太多,而在于它写入了一个字符太多。
0赞 Martin B 10/19/2009
细节决定成败......我想这就是我们成为程序员的原因。;)编辑为“处理一个字符太多”,因为这也是对实际应用程序中会发生什么的良好描述。
1赞 Sinan Ünür 10/19/2009 #3

C FAQ 列表有一个答案以及许多其他此类常见问题的答案

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