fgets在文件中逐行读取

时间:2014-01-17 07:31:56

标签: c file-io fgets

我知道fgets读取直到EOF或换行符。

我写了一个示例代码来读取文件中的行,我观察到fgets的执行次数超过了所需的次数。这是一个非常简单的文件,只有两个空行,即。我按了一次输入并保存了文件。

以下是代码:

fp = fopen("sample.txt","r");
while (!feof(fp)) {
        fgets(line,150,fp);
        i++;
        printf("%s",line);
}
printf("%d",i);

为什么while循环执行三次而不是2次,因为文件中只有两个空行?

1 个答案:

答案 0 :(得分:18)

在你的情况下,最后一行似乎是两次阅读,但事实并非如此。对fgets的最后一次调用返回NULL以指示已读取文件的结尾。您不检查,并再次打印缓冲区的旧内容,因为缓冲区未更新。

通常最好不要使用feof并检查f...系列函数的返回值:

fp = fopen("sample.txt", "r");
while (1) {
        if (fgets(line,150, fp) == NULL) break;
        i++;
        printf("%3d: %s", i, line);
}
printf("%d\n",i);

函数feof在尝试读取超出文件末尾后返回true,这只发生在您fgets的最后一次(不成功)调用之后,在读取,或者在文件结束之前读取。这个long SO post中的答案解释得更多。