2

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

#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 file\n");
        getchar();
        return 0;
    }

    while (!feof(file_para))
    {
        fgets(string, 400, file_para);
        printf("**** %s", string);
    }

    fclose(file_para);
    getchar();
    return 0;
}
4

2 回答 2

1

这是错误的使用方式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)即使没有评估为 true feof(file_para)......所以也许您需要while (!feof(file_para) && !ferror(file_para)),但这实际上只是更多的证据表明while循环应该以 I/O 函数为条件,而不是feof().

于 2013-09-17T00:41:45.350 回答
1

这是一个常见的反模式:

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

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

正确的模式是:

while (fgets(string, 400, file_para))
{
于 2013-09-17T00:40:59.217 回答