【问题标题】:Recognizing EOF vs newline in getline in C在 C 中的 getline 中识别 EOF 与换行符
【发布时间】:2021-03-05 13:42:48
【问题描述】:

有什么方法可以识别getline是因为换行还是因为EOF而结束?

所以,我想区分一下:

1。 阿尔法\n测试版\n伽马\n EOF

2。 alfa \n beta \n gama EOF

在第二种情况下,我不想将 gama 读取为新字符串,我想说的是,最后一个字符串的读取不成功。我正在使用 while 循环来读取行。

我无法编辑传入的数据。

可能有可能通过使用 getchar 来解决这个问题。然而,它使阅读线更加复杂:-/

非常感谢

【问题讨论】:

  • 您可以使用feof 函数在流上测试EOF,但它不会返回true,直到之后您尝试阅读过去文件结束。
  • 用 fgetc 读取下一个字符,检查它的 EOF,如果没有,用 ungetc 放回去。
  • 我不知道你为什么不能只使用getline。在这两种情况下,您都会一次获得一条线路。在 EOF 上,返回值为 -1。但是,直到 第四次 调用你才能得到它。在第一种情况下,返回顺序将是:5,5,5,-1,在第二种情况下,它将是:5,5,4,-1 只有最后可以不同,你可以看:buf[len - 1] == '\n'。无法在同一个调用中同时获得非零长度 EOF 指示。

标签: c newline eof getline


【解决方案1】:

fgets() 一样,getline() 在字符串中包含尾随换行符。因此,只需在成功调用后检查最后一个字符,看看它是否为'\n'。如果是其他内容,则文件的最后一行没有尾随换行符。

【讨论】:

  • 检查最后一个字符值得详细说明。使用getline(),考虑到 -1 返回或读取空字符,很容易编码错误。 fgets() 有其他情况会导致检查最后一个字符有问题。
【解决方案2】:

有什么方法可以识别getline是因为换行还是因为EOF而结束?

如果行输入因文件结束而停止,feof() 返回 true。

ssize_t nread = getline(&line, &len, stream);
if (feof(stream)) {
  puts("Input ended due to end-of-file");
}
if (nread > 0 && line[nread-1] == '\n') {
  puts("Input ended due to end-of-line");
}

两者都可能为假:输入错误或分配失败。


关于fgets(),当缓冲区已满或读取空字符时会出现其他问题。

【讨论】:

    【解决方案3】:

    感谢您的提示。

    最后我使用了更简单的方法。

    characters = getline(&line, &len, stream);

    if (characters==-1) {puts("Input ended by EOF after \n");}

    if (feof(stdin)) {puts("Input ended by just EOF");}

    【讨论】:

    • 在读取一些输入然后发生文件结束后,getline() 不返回 -1。 getline() 返回 -1 的原因至少有 4 个。在没有其他输入后遇到EOF
    猜你喜欢
    • 2011-01-21
    • 1970-01-01
    • 1970-01-01
    • 2016-02-28
    • 2015-04-06
    • 2019-11-13
    • 2011-01-16
    • 2016-02-18
    • 1970-01-01
    相关资源
    最近更新 更多