提问人:Jan Dunder 提问时间:11/23/2020 更新时间:11/23/2020 访问量:2607
在 C 语言中识别 EOF 与换行符
Recognizing EOF vs newline in getline in C
问:
有没有办法识别 getline 是否因为换行符或 EOF 而结束?
所以,我想区分一下:
1. 阿尔法 \n 贝塔 \n 伽马 \n EOF
2. 阿尔法 \n beta \n gama EOF
在第二种情况下,我不想将 gama 读作一个新字符串,我想说,最后一个字符串的读取不成功。我正在使用 while cycle 来阅读行。
我无法编辑传入的数据。
可能有可能通过使用 getchar 来解决这个问题。然而,它使阅读行更加复杂:-/
非常感谢
答:
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
评论
feof
EOF
true
getline
5,5,5,-1
5,5,4,-1
buf[len - 1] == '\n'