EOF 可以与 \n 在同一行上吗

Can EOF be on the same line as \n

提问人:Malcolm 提问时间:1/30/2018 最后编辑:PabloMalcolm 更新时间:1/30/2018 访问量:2414

问:

正如标题所说,可以与 ?我目前正在做一个用 C 重新创建的项目,我正在实现发生的事情,我试图弄清楚我是否会得到文本文件的最后一行:EOF"\n"getlineEOF

"blahblahblahblah\n\0"

"blahblahblah\n
 \0"
C file-io stdin eof

评论

1赞 Weather Vane 1/30/2018
文件末尾、行尾和字符串末尾都大不相同。例如,某些文本文件格式确实在文件末尾作为标记,但通常不存储在文件中。它是读取文件的函数返回的值。0x1AEOF
3赞 Pablo 1/30/2018
EOF不能存储在字符串中,因为 是有符号整数,不适合 .EOFchar
0赞 Benjamin Barrois 1/30/2018
这是一个奇怪的问题,因为您在第二个示例中键入的退格键使您的示例等效于 。顺便说一句,我不明白为什么像“\n”和“\0”这样的特殊字符应该写成文本文件中的字符,因为它们不会有其原始角色,因为它们将被解释为 2 个字符。"blahblahblahblah\n\n\0"

答:

2赞 taskinoor 1/30/2018 #1

EOF 是通知没有更多输入的信号。最后名为 EOF 的文件中没有实际数据。EOF 与 null 字符不同。\0

我想你想知道你是否可以在不先获得换行符的情况下获得 EOF。答案是肯定的。如果文件末尾没有换行符,即最后一行结束时没有换行符,这是可能的。您可以通过打开文本编辑器,键入一些文本并保存,退出而无需按 Enter 键来轻松生成此类文件。该文件的末尾不会有任何换行符。

评论

2赞 Weather Vane 1/30/2018
例如,某些文本文件格式确实在文件末尾作为标记。0x1A
0赞 taskinoor 1/30/2018
@WeatherVane,但这是特定于格式的。一般来说,没有这样的标记。并且 EOF 不保证与 相同。我想你必须专门处理这种格式。0x1A
4赞 chux - Reinstate Monica 1/30/2018 #2

EOF 可以与 \n 在同一行上吗

是的,但很少。

EOF是一个常数,通常用于表示 1) 文件结束或 2) 罕见的输入错误。它通常不会被编码为文本流中的字符。

返回值 from 和 friends 可以随时出现 - 甚至在中间由于错误而出现。EOFfgetc()


否则,不可以:

文件末尾不会出现在带有 .通常,文件中至少包含 1 个字符(并且没有“\n”)的最后一行也将是一行'\n'

文本流是组成行的有序字符序列,每行由零个或多个字符以及一个终止换符组成。最后一行是否需要终止换行符是实现定义的。C11dr §7.21.2 2

评论

0赞 chux - Reinstate Monica 1/30/2018
@Malcolm 请注意,从流中读取并不特殊。在阅读一行时,它被视为任何其他非字符。 通常不会在文本流中找到,但可以存在 - 并且会给假定它们不存在的代码带来麻烦。'\0''\n''\0'
2赞 Pablo 1/30/2018 #3

扩展 @taskinoor 和 @chux 的答案,在查看您的示例后,我认为您可能会与字符串的终止字节混淆。EOF'\0'

EOF是一个值,其功能类似于 Return,用于告诉用户它无法从流中读取更多内容。这就是为什么你经常看到这个: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
}

请注意,这里声明为 ,因为 是 和 是返回的东西。我之前在这里做过一个声明1 不太正确,chux 指出了我的错误,我想在这里引用他/她的评论:cintEOFsigned intgetc

用户 chux 对我的回答发表评论

EOF,作为负常数,通常为 -1,并且可以适合 ,当 char a . 与其说它不合适,不如说将 a 存储在 char 中是无法区分的 从存储中,比如说一个值为 255 的字符。charsigned charEOFchar

'\0'另一方面,是用于终止 C 中的字符串的字节。在 C a 字符串只不过是以 C. 结尾的字符序列 字节。我们使用数组来存储字符串。所以和是不同的 事物,甚至有不同的价值观。charEOF\0


脚注

1请注意,这里声明为 ,因为 是 和 实际上不适合 ,所以它永远不会成为 C 字符串的一部分。cintEOFsigned intchar

评论

0赞 chux - Reinstate Monica 1/30/2018
EOF,作为负常数,通常为 -1,并且可以拟合 ,当 .与其说它不合适,不如说将 a 存储在 a 中与将值为 255 的字符存储在 a 中是无法区分的。charcharsigned charEOFcharchar
0赞 Pablo 1/30/2018
@chux感谢您的反馈,我更正了我的答案。