【问题标题】:Is trailing newline necessary in fgets?fgets中是否需要尾随换行符?
【发布时间】:2014-10-31 10:12:48
【问题描述】:

当我使用 'fgets' 和 'newline' 关键字进行搜索时,有很多关于如何删除尾随换行符的帖子(这种删除似乎是一种负担)。然而,对于 fgets 如何必须包含该换行符,似乎几乎没有解释。同样在 C++ 中,'std::getline' 和 'std::istream:getline' 方法不会保留换行符。那么有什么原因吗?

【问题讨论】:

  • C 的原作者为什么决定包含换行符可能没有任何特殊的论据。它只是 - 这就是 fgets() 所做的。如果不包括换行符,就会有人问为什么不包括在内。
  • 谢谢,不。我可以把它当作设计,只是个人觉得它可能不是一个好的。
  • 注意:fgets() 将愉快地读取并放入其嵌入的缓冲区 '\0' 并因此读取 6 char 并形成像 'A''B''C'、@ 这样的缓冲区987654327@、'D''\n''\0'。嫌疑人std::istream:getline 也很好地读取了嵌入的'\0'。 IMO,fgets() 不返回读取的长度是一个更大的缺陷。 strlen() 是不够的,因为它确实准确地报告了fgets() 在所有情况下读取的数据。

标签: c newline fgets


【解决方案1】:

这里是令人满意的(恕我直言)解释:
http://www.cplusplus.com/reference/cstdio/fgets/

特别是:

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

【讨论】:

  • 感谢您的评论。所以它的设计是“它被函数认为是一个有效字符并包含在复制到str的字符串中”。但是这种设计驱使人们努力去除换行符,而 C++ 同行不遵循这种设计。
  • @Lyn 但如果它被删除,其他人将不得不努力保留换行符。人们有不同的需求。而 C++ 所做的并不真正相关。这是两种不同的语言,有着不同的目标。
  • 谢谢你的解释,有道理。
【解决方案2】:

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

The manual page 说:

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

所以这就是它的行为方式。

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

【讨论】:

  • 也就是说,如果我以 EOF 结尾,那么不会存储任何额外内容,我做对了吗?
猜你喜欢
  • 1970-01-01
  • 2022-01-05
相关资源
最近更新 更多