在C语言的getline函数中如何区分EOF和换行符

3
有没有办法区分getline是因为换行符还是因为EOF而结束了呢?
我想区分以下两种情况:
1. alfa \n beta \n gama \n EOF
2. alfa \n beta \n gama EOF
在第二种情况下,我不想将gama读入一个新的字符串,并且我想说,最后一行的读取失败了。我正在使用while循环读取这些行。
我无法编辑传入的数据。
可能可以通过使用getchar来解决这个问题,但它会使读取行更加复杂 :-/
非常感谢。

你可以使用 feof 函数来测试流中的 EOF,但它只有在你尝试读取文件末尾之后才会返回 true - John Bode
使用fgetc读取下一个字符,检查是否为EOF,如果不是,则使用ungetc将其放回。 - unlut
3
我不确定为什么你不能使用getline。在这两种情况下,你将逐行获取回复。在 EOF 时,返回值将是-1。但是,直到第四次调用才会得到EOF的返回值。在第一种情况下,返回序列将是:5,5,5,-1,而在第二种情况下,它将是:5,5,4,-1。只有最后一行可能会不同,你可以查看:buf[len - 1] == '\n'。无法同时在同一次调用中获取非零长度和 EOF 表示。 - Craig Estey
3个回答

5

fgets() 一样,getline() 函数也包含字符串中的换行符。因此,只需在调用成功后检查最后一个字符是否是 '\n' 即可。如果是其他字符,则表示文件的最后一行没有换行符。


检查最后一个字符需要细节处理。使用getline()时,容易因为返回-1或读取空字符而编写错误的代码。fgets()有额外的情况,使得检查最后一个字符变得棘手。 - chux - Reinstate Monica

3
有没有办法判断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(),当缓冲区已满或读取了空字符时,会出现额外的问题。


0

谢谢你的提示。

最终我用了更简单的方式来完成它。

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

if (characters==-1) {puts("输入以EOF结束\n");}

if (feof(stdin)) {puts("仅通过EOF输入结束\n");}


在读取一些输入后,如果出现文件结尾,getline() 不会返回 -1。至少有 4 个原因导致 getline() 返回 -1。在没有其他输入的情况下遇到 EOF 是其中之一。 - chux - Reinstate Monica

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接