C语言 feof() 在 Linux 上返回比结束行晚一行的 true



我是C的初学者。当我使用它时循环打印文件的包含。最后一行将在 Linux 上打印两次。当到达文件末尾时,它不应该进入 while 循环。它在窗户上没有问题。

#include <stdio.h>
#include <unistd.h>
int main()
{
    char string[400];
    FILE *file_para;
    // Open the file
    if ((file_para = fopen("Test.txt", "r")) == NULL)
    {
        printf("cannot open filen");
        getchar();
        return 0;
    }
    while (!feof(file_para))
    {
        fgets(string, 400, file_para);
        printf("**** %s", string);
    }
    fclose(file_para);
    getchar();
    return 0;
}
这是

使用feof()的错误方式。 使用 feof() 检测其中一个主要 I/O 功能失败后出现的问题。 它不能预测您是否即将达到 EOF;它告诉您某些 I/O 函数何时已报告 EOF。 C 不是帕斯卡;在 Pascal 中,您可以(必须?)在调用 I/O 函数之前检查 EOF。

while (fgets(string, sizeof(string), file_para) != 0)
{
    ...do printing, etc...
}
// If you need to, use `feof()` and `ferror()` to sort out what went wrong.

如果你真的,真的坚持使用feof(),那么你还需要检查你的I/O操作:

while (!feof(file_para))
{
    if (fgets(string, sizeof(string), file_para) == 0)
        break;
    ...do printing, etc...
}

请注意,您可能会失败,因为即使ferror(file_para)没有,feof(file_para)的评估结果也会为 true...所以也许你需要while (!feof(file_para) && !ferror(file_para)),但这实际上只是更多的证据,证明while循环应该以I/O功能为条件,而不是feof()

这是一个常见的反模式:

while (!feof(file_para))
{
    fgets(string, 400, file_para);

feof() 不会检测下一个输入调用是否会由于文件末尾而失败;它会告诉您文件是否已到达文件末尾。 您应该仅在输入函数已经失败调用它,以查看它失败的原因(可能是错误或文件结尾)。

正确的模式是:

while (fgets(string, 400, file_para))
{

相关内容

  • 没有找到相关文章

最新更新