C fgets中是否需要尾部换行符?

C fgets中是否需要尾部换行符?,c,newline,fgets,C,Newline,Fgets,当我使用“fgets”和“newline”关键字进行搜索时,有很多帖子都在讨论如何删除尾随的换行符(这样的删除似乎是一个负担)。然而,似乎很少有人解释这条新线对于FGET的必要性。同样在C++中,“STD::GETLIN”和“STD::ISTRAM:GETLIN”方法将不保留换行符。这有什么原因吗?这里有一个令人满意的解释: 特别是: 换行符使FGET停止读取,但函数认为它是有效字符,并包含在复制到str的字符串中 不,没有必要,但如果存在,它将包含在返回行中 说: EOF或换行后,读取停止。

当我使用“fgets”和“newline”关键字进行搜索时,有很多帖子都在讨论如何删除尾随的换行符(这样的删除似乎是一个负担)。然而,似乎很少有人解释这条新线对于FGET的必要性。同样在C++中,“STD::GETLIN”和“STD::ISTRAM:GETLIN”方法将不保留换行符。这有什么原因吗?

这里有一个令人满意的解释:

特别是:

换行符使FGET停止读取,但函数认为它是有效字符,并包含在复制到str的字符串中


不,没有必要,但如果存在,它将包含在返回行中

说:

EOF
或换行后,读取停止。如果新行被读取,它将被存储到缓冲区中。在缓冲区中最后一个字符之后存储一个终止的空字节(
'\0'

这就是为什么它会这样


请注意,您不能假设缓冲区中有换行符last,必须在删除它之前进行检查,否则如果最后一行没有换行符,您可能会截断它。

对于C的原始作者决定包含换行符的原因,可能没有任何例外的论据。这就是fgets()所做的。如果新行没有包括在内,会有其他人问为什么没有包括在内。谢谢不。我可以认为它是设计出来的,只是我个人觉得它可能不是一个好的。注意:
fgets()
会很高兴地阅读并将其放入嵌入的缓冲区
'\0'
,从而读取6
char
,并形成一个类似
'a'
的缓冲区,
'B'
'C'
'\0'
'D'
'\n'
'\0'
。可疑
std::istream:getline也能很好地读取嵌入的
'\0'
。IMO,
fgets()
不返回读取的长度是一个更大的缺陷
strlen()
是不够的,因为它在所有情况下都能准确地报告由
fgets()读取的数据。谢谢您的评论。因此,它的设计是“函数认为它是有效字符,并包含在复制到str的字符串中”。但是这个设计会驱使人们努力去删除新线字符,而C++对应者不遵循这个设计。@ LYN,但是如果被删除,其他人就必须努力维护新行。人们有不同的需求。C++所做的,并不是真正相关的;这是两种不同的语言,有着不同的目标。谢谢你的解释,这是有意义的。这意味着如果我以EOF结束,那么就不会存储任何额外的内容,我做对了吗?