为什么我的 feof 循环无限运行,即使文件结束了?[复制]

Why does my feof loop run infinitely, even though the file does end? [duplicate]

提问人:sawaszef 提问时间:3/9/2021 最后编辑:chqrliesawaszef 更新时间:3/9/2021 访问量:331

问:

所以我想把我拥有的文件的行数作为函数的参数,但我不知道为什么这个循环无限期地运行。

int count_numbers(FILE *filea) {
    int i;
    while (!feof(filea)) {
        i++;
    }
    fclose(filea);
    i--;
    return i;
}
C 循环 文件 feof

评论

0赞 Thomas Jager 3/9/2021
feof不接受任何新事物。如果文件描述符尚未标记为位于文件末尾,则它不会突然成为循环中的 EOF。
0赞 user3386109 3/9/2021
请参阅为什么 while(!feof(fp)) 总是错的?
2赞 Marco Bonelli 3/9/2021
为什么没有在两分钟内将其作为副本关闭?为什么“while ( !feof (file) )”总是错的?

答:

0赞 David Schwartz 3/9/2021 #1

循环中的任何内容都不可能更改文件的 EOF 标志。循环中的所有内容都不能导致遇到文件末尾。因此,如果循环一次,循环将无限次循环。i++;

评论

0赞 user1717828 3/9/2021
关于你的答案的元问题:我注意到你从一句话的答案开始,然后开始更新它以更详细地填写句子。我还注意到你有很高的声誉,并且可能知道在 SO 上获得声誉的事情。我想知道:是否希望尽早使用时间戳来获取某些内容以劝阻其他回答者开始响应,还是有其他原因从这样的存根答案中进行迭代?
0赞 chqrlie 3/9/2021
@user1717828:这个问题可能很快就会结束。在此之前,大卫可能已经尝试并成功地发布了答案......但我只是猜测。
0赞 David Schwartz 3/9/2021
@user1717828我认为这是两件事的结合。部分原因是我总是在为时已晚之后想到我应该说的话,但我认为另一个是痛苦的经历,即对一个好问题撰写一个冗长而深思熟虑的答案,结果却关闭了该问题或删除了该问题。此外,作为重复的结束通常对 OP 没有帮助,而“大部分”是重复的答案则有帮助。
3赞 chqrlie 3/9/2021 #2

您的函数根本不计算行数,并且存在多个问题:

这是一个修改后的版本:

int count_lines(FILE *filea) {
    int c;
    int last = '\n';
    int lines = 0;

    while ((c = getc(filea)) != EOF) {
        if (c == '\n')
            lines++;
        last = c;
    }
    if (last != '\n') {
        // last line does not have a trailing newline, adjust the count
        lines++;
    }
    return lines;
}

评论

0赞 user1717828 3/9/2021
这个函数是怎么用的?filea
0赞 chqrlie 3/9/2021
@user1717828:哎呀!答案已更新。