在 C 语言中识别 EOF 与换行符

Recognizing EOF vs newline in getline in C

提问人:Jan Dunder 提问时间:11/23/2020 更新时间:11/23/2020 访问量:2607

问:

有没有办法识别 getline 是否因为换行符或 EOF 而结束?

所以,我想区分一下:

1. 阿尔法 \n 贝塔 \n 伽马 \n EOF

2. 阿尔法 \n beta \n gama EOF

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

我无法编辑传入的数据。

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

非常感谢

C 换行符 EOF GetLine

评论

0赞 John Bode 11/23/2020
您可以使用该函数对流进行测试,但直到您尝试读取文件末尾,它才会返回。feofEOFtrue
0赞 unlut 11/23/2020
用 fgetc 读取下一个字符,检查其 EOF,如果没有,请用 ungetc 将其放回原处。
3赞 Craig Estey 11/23/2020
我不确定为什么你不能只使用 .在这两种情况下,您一次都会取回一行。在 EOF 上,返回值将为 -1。但是,直到第四次通话,您才会得到它。在第一种情况下,返回序列将是:,在第二种情况下,它将是: 只有最后一可以不同,您可以查看: 。无法在同一调用中同时获取非零长度 EOF 指示。getline5,5,5,-15,5,4,-1buf[len - 1] == '\n'

答:

5赞 Shawn 11/23/2020 #1

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

评论

0赞 chux - Reinstate Monica 11/23/2020
检查最后一个字符值得详细说明。使用 ,考虑到 -1 返回或读取 null 字符,很容易编码错误。 有其他情况,使检查最后一个字符成为问题。getline()fgets()
3赞 chux - Reinstate Monica 11/23/2020 #2

有没有办法识别 getline 是否因为换行符或 EOF 而结束?

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

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");
}

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


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

0赞 Jan Dunder 11/23/2020 #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");}

评论

0赞 chux - Reinstate Monica 11/23/2020
读取某些输入后,然后发生文件末尾,不返回 -1。返回 -1 至少有 4 个原因。没有其他输入后的遭遇是其中之一。getline()getline()EOF