【问题标题】:Input text file not being read completely输入文本文件未完全读取
【发布时间】:2014-10-05 22:26:29
【问题描述】:

我在 main 中有以下程序

fgets(buffer, 99, stdin);
while (!feof(stdin))
{
printf("PrintF : %s\n", buffer);
fgets(buffer, 99, stdin);
}
return 0;

我启动一个 cmd 窗口并编译,然后使用文件参数运行程序。

file.exe < samplefile.txt

在 txt 文件中我有以下几行

你好这是

一个示例文件

通过 alanz2223

但是输出是

PrintF : 你好这是

PrintF:一个示例文件

它似乎省略了“by alanz2223”这一行。 根据 fgets() 函数描述,它从流中读取字符并将它们作为 C 字符串存储到 str(第一个参数)中,直到读取 (num-1) 个字符或到达换行符或文件结尾,以先发生者为准。

根据此描述,然后在“Hello this is”之后接近一个换行符,输出应该在那里结束,但它进入下一行并输出“一个样本文件”,然后接近一个换行符,但有一个下一行。似乎在第二行之后程序终止,就好像它接近文件末尾一样。

【问题讨论】:

    标签: c file file-io io


    【解决方案1】:

    记住 fgets 将文件缓冲区移动到它读取的行的末尾。最后一行没有被打印,因为该函数读取最后一行,然后将文件缓冲区移动到 feof 函数终止 while 循环的行的末尾。尝试在循环结束后添加 printf:

    fgets(buffer, 99, stdin);
    while (!feof(stdin))
    {
    printf("PrintF : %s\n", buffer);
    fgets(buffer, 99, stdin);
    }
    printf("PrintF : %s\n", buffer);
    return 0;
    

    【讨论】:

    • 解决了问题,我不知道 fgets 将文件缓冲区移动到了行尾。我很感激。
    【解决方案2】:

    去掉无用的feof,测试fgets是否返回错误。 “读取时文件结束”是a defined return value

    一个好处是您可以将阅读和写作行按更合乎逻辑的顺序排列。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多