提问人:Jason Baker 提问时间:10/19/2009 最后编辑:CommunityJason Baker 更新时间:10/20/2009 访问量:849
为什么这个 C 代码有问题?
Why is this C code buggy?
问:
关于另一个问题,Jerry Coffin指出了以下几点:
它(可能)与您的问题无关,但几乎是一个有保证的错误。
while (!feof(fileptr)){
我想我会开始一个单独的问题,因为该评论有点偏离主题。有人可以向我解释一下吗?这是我以前用 C 编写的第一个程序。
答:
5赞
user181548
10/19/2009
#1
谷歌发现这个:http://www.drpaulcarter.com/cs/common-c-errors.php#4.2
它说“作者还没有看到任何学生正确使用 feof() 函数!
总而言之,C 文件的功能类似于并返回状态值,无论如何您<blink>不应忽略</blink>。检查的价值是那些在马已经逃跑后闩上马厩门的人之一。fread
fwrite
feof
评论
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);
}
将处理一个字符太多。
正确的方法是检查(或您用于读取的任何函数)的返回值,或者,在执行读取的函数之后调用。例如:fread
feof
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 语言中,只有在输入例程尝试读取并失败后才会指示文件末尾。
评论