EOF可以和\ n在同一行吗?

时间:2018-01-29 18:11:17

标签: c file-io stdin eof

正如标题所说,EOF可以与"\n"位于同一行吗?我目前正在研究一个在C中重新创建getline的项目,我正在实现EOF处发生的事情,我试图找出将文本文件的最后一行作为:

"blahblahblahblah\n\0"

"blahblahblah\n
 \0"

3 个答案:

答案 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,因为EOFsigned int, 是getc返回的内容。我之前在这里发表了一个声明 1 并不正确,chux 指出了我的错误,我想在此引用他/她的评论:

  

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

     

EOF,作为负常数,通常为-1,当char char时,可以放在signed char中。   并不是因为它不适合,而是将EOF存储在char中是无法区分的   在char中存储说出值为255的字符。

     另一方面,

'\0'是用于终止C中的字符串的字节   C字符串只不过是一系列以此为结尾的字符   字节。我们使用char数组来存储字符串。因此EOF\0不同   事情,甚至有不同的价值观。

<强>脚注

1 请注意,c声明为int,因为EOFsigned int, 实际上并不适合char,所以它永远不会成为c-string的一部分。