当我使用'fgets'和'newline'关键字进行搜索时,有很多关于如何去除尾随换行符的帖子(并且这种移除似乎是一种负担)。然而,似乎没有什么关于fgets如何包含新行的解释。同样在C++中,'std :: getline'和'std :: istream:getline'方法不会保留换行符。那么是否有理由呢?在fgets中是否需要换行符?
回答
这里被满足(恕我直言)解释:
http://www.cplusplus.com/reference/cstdio/fgets/
特别:
一个换行符使得与fgets停止阅读,但它被认为是由功能的有效字符和字符串中包含复制到str。
感谢您的评论。所以它在设计上被认为是“它被函数认为是一个有效的字符,并被包含在复制到str的字符串中”。但是这种设计驱使人们努力去除换行符,而C++对手并不遵循这种设计。 – Lyn 2014-10-31 10:23:00
@Lyn但是,如果它被删除,其他人将不得不努力*保留新行。人们有不同的需求。而C++所做的并不是真正相关的;这些是两种不同目标的不同语言。 – user694733 2014-10-31 10:25:20
感谢您的解释,这是有道理的。 – Lyn 2014-10-31 10:28:15
不,这不是必要的,但如果存在的话,它将被包括在返回的行中。
The manual page说:一个EOF
或换行后
读停止。如果读取换行符,则将其存储到缓冲区中。终止空字节(
'\0'
)存储在缓冲区中的最后一个字符之后。
所以这就是为什么它的行为。
请注意,您不能假设缓冲区中将存在最后一个换行符,您必须在删除它之前进行检查,否则如果它没有换行符,则可能会截断最后一行。
所以这意味着如果我以EOF结束,那么没有额外的东西被存储,我是否正确? – 2017-02-18 11:47:28
- 1. 执行sed时不需要换行符中的换行符
- 2. malloc中是否需要类型转换?
- 3. JS Twitter部件总是创建换行符,需要同一行
- 4. IIS中是否需要AppDomain?
- 5. 我是否需要将会话变量转换为字符串?
- 6. 是否需要转换字符串的字节顺序?
- 7. const是否需要类型说明符?
- 8. 点符号 - 是否需要参数?
- 9. 不需要换行符包括
- 10. 需要额外换行字符
- 11. 如何从PHP中的fgets函数中消除换行符?
- 12. 是否需要LDT?
- 13. UINavigationController是否需要?
- 14. 是否需要SQLCipher?
- 15. 是否需要main.cpp?
- 16. 是否需要Zend_Acl?
- 17. 是否需要AudioServicesDisposeSystemSoundID?
- 18. 是否需要UserController?
- 19. 是否需要在onActivityResult()中使用super.onActivityResult()?
- 20. 在.NET中,是否需要注册DLL?
- 21. 是否需要在div中写ui-view?
- 22. 是否需要在Delphi中使用GUID?
- 23. 我是否需要进行坐标转换?
- 24. Schema.org电话链接是否需要换行元素?
- 25. 如何从PHP变量中修剪不需要的换行符/换行符?
- 26. mysql_close()是否需要进行REAL优化?
- 27. 是否需要执行pushViewController的UINavigationController?
- 28. 运行Maven是否需要JRebel?
- 29. 是否需要运行sitemesh .tld?
- 30. Intel HAXM是否需要运行Android Studio?
为什么C的原作者决定包含换行符,可能没有任何特殊的理由。它只是 - 这是fgets()所做的。如果不包含换行符,则会有其他人询问为什么不包含换行符。 – nos 2014-10-31 10:21:51
谢谢你。我可以通过设计,只是个人觉得它可能不是一个好的。 – Lyn 2014-10-31 10:26:06
注意:'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