【问题标题】:fgets to read line by line in filesfgets 逐行读取文件
【发布时间】:2014-01-17 07:31:55
【问题描述】:

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

我编写了一个示例代码来从文件中读取行,我观察到 fget 的执行次数超过了预期的次数。这是一个非常简单的文件,只有两个空行,即。我按了一次 Enter 并保存了文件。

下面是代码:

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

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

【问题讨论】:

  • 如果您使用的是 Linux,请尝试输入 od -c sample.txt
  • 我看到这个命令有四行......虽然文件中只有两行,即只看到两行 \n..@Marian
  • 我发现这个link 解释了同样的问题,但我仍然不清楚解释。如果 fgets 第三次读取 NULL,为什么会重复最后一行?此外,如果它读取第二行,缓冲区应该被清除吧? @玛丽安

标签: c file-io fgets


【解决方案1】:

在您的情况下,最后一行似乎被读取了两次,但事实并非如此。对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中的答案解释更多。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-10
    • 1970-01-01
    • 2021-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多