正如标题所说,EOF
可以与"\n"
位于同一行吗?我目前正在研究一个在C中重新创建getline
的项目,我正在实现EOF
处发生的事情,我试图找出将文本文件的最后一行作为:
"blahblahblahblah\n\0"
或
"blahblahblah\n
\0"
答案 0 :(得分:2)
EOF是一个通知没有更多输入的信号。最后,名为EOF的文件中没有实际数据。 EOF与空字符\0
不同。
我想你想知道你是否可以在没有获得新行的情况下获得EOF。答案是肯定的。如果文件末尾没有换行符,即最后一行完成时没有换行符,则有可能。您可以通过打开文本编辑器,键入一些文本并保存,退出而不按ENTER键来轻松生成此类文件。该文件最后没有任何换行符。
答案 1 :(得分:2)
EOF可以与\ n
位于同一行
是的,但很少。
EOF
是一个常量,通常用于表示1)文件结束或2)罕见的输入错误。它通常不会编码为文本流中的字符。
来自EOF
和朋友的fgetc()
的返回值可以随时发生 - 即使在行的中间由于错误而发生。
否则,否:
文件结尾不会出现在带有'\n'
的行的末尾。通常,文件中包含至少1个字符(并且没有“\ n”)的最后一行也是行。
文本流是由行组成的有序字符序列,每行由零个或多个字符加上终止的换行符组成。最后一行是否需要终止换行符是实现定义的。 C11dr§7.21.22
答案 2 :(得分:2)
扩展@ taskinoor和@ chux的答案,在查看您的示例之后,我认为您可能会将EOF
与'\0'
- 字符串的终止字节混淆。
EOF
是一个像getc
这样的函数返回告诉用户它无法再从流中读取的值。这就是为什么你经常看到这个:
// fp is a FILE*, it may be stdin
// it may be a file on the disk or something
// else
int c;
while((c = getc(fp)) != EOF)
{
// doing something with the character
}
请注意,c
声明为int
,因为EOF
是signed int
,
是getc
返回的内容。我之前在这里发表了一个声明 1 并不正确,chux
指出了我的错误,我想在此引用他/她的评论:
用户chux对我的回答发表评论
另一方面,
EOF
,作为负常数,通常为-1,当charchar
时,可以放在signed char
中。 并不是因为它不适合,而是将EOF
存储在char中是无法区分的 在char
中存储说出值为255的字符。
'\0'
是用于终止C中的字符串的字节 C字符串只不过是一系列以此为结尾的字符 字节。我们使用char
数组来存储字符串。因此EOF
和\0
不同 事情,甚至有不同的价值观。
<强>脚注强>
1 请注意,c
声明为int
,因为EOF
是signed int
,
实际上并不适合char
,所以它永远不会成为c-string的一部分。