Linux上的feof()在结束行之后的一行返回true

时间:2013-09-17 00:34:30

标签: c linux fopen feof

我是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;
}

2 个答案:

答案 0 :(得分:1)

这是一种常见的反模式:

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

feof()未检测到 next 输入调用是否会因文件结尾而失败;它告诉您文件是否到达文件结尾。你应该只在输入函数失败后才调用,看看它失败的原因(可能是错误或文件结束)。

正确的模式是:

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

答案 1 :(得分:1)

这是使用feof()的错误方法。使用feof()检测其中一个主I / O功能失败后出现的问题。它无法预测你是否即将达到EOF;它会告诉您某些I / O功能何时报告了EOF。 C不是Pascal;在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的证据{1}}循环应以I / O函数为条件,而不是feof()