2014-10-31 104 views
2

当我使用'fgets'和'newline'关键字进行搜索时,有很多关于如何去除尾随换行符的帖子(并且这种移除似乎是一种负担)。然而,似乎没有什么关于fgets如何包含新行的解释。同样在C++中,'std :: getline'和'std :: istream:getline'方法不会保留换行符。那么是否有理由呢?在fgets中是否需要换行符?

+1

为什么C的原作者决定包含换行符,可能没有任何特殊的理由。它只是 - 这是fgets()所做的。如果不包含换行符,则会有其他人询问为什么不包含换行符。 – nos 2014-10-31 10:21:51

+1

谢谢你。我可以通过设计,只是个人觉得它可能不是一个好的。 – Lyn 2014-10-31 10:26:06

+0

注意:'fgets()'会高兴地读取并在其缓冲区中嵌入''\ 0'',从而读取6个'char'并形成一个像“A”,“B”,“C” '',''\ 0'',''D'',''\ n'',''\ 0''。怀疑'std :: istream:getline'也很好地读取嵌入的''\ 0''。 IMO,'fgets()'不返回长度读取是一个更大的缺陷。 'strlen()'是不够的,因为它在所有情况下都精确地报告由'fgets()'读取的数据。 – chux 2014-10-31 13:20:04

回答

3

这里被满足(恕我直言)解释:
http://www.cplusplus.com/reference/cstdio/fgets/

特别:

一个换行符使得与fgets停止阅读,但它被认为是由功能的有效字符和字符串中包含复制到str。

+0

感谢您的评论。所以它在设计上被认为是“它被函数认为是一个有效的字符,并被包含在复制到str的字符串中”。但是这种设计驱使人们努力去除换行符,而C++对手并不遵循这种设计。 – Lyn 2014-10-31 10:23:00

+3

@Lyn但是,如果它被删除,其他人将不得不努力*保留新行。人们有不同的需求。而C++所做的并不是真正相关的;这些是两种不同目标的不同语言。 – user694733 2014-10-31 10:25:20

+0

感谢您的解释,这是有道理的。 – Lyn 2014-10-31 10:28:15

2

不,这不是必要的,但如果存在的话,它将被包括在返回的行中。

The manual page说:一个EOF或换行后

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

所以这就是为什么它的行为。

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

+0

所以这意味着如果我以EOF结束,那么没有额外的东西被存储,我是否正确? – 2017-02-18 11:47:28