當我使用'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. fgets(STDIN)自動換行符?
- 2. 在fgets中檢測換行
- 3. 執行sed時不需要換行符中的換行符
- 4. malloc中是否需要類型轉換?
- 5. 識別字符串中是否存在不需要的字符
- 6. 是否需要切換HTML5和CSS3?
- 7. FlashDevelop中是否需要boildercode?
- 8. IIS中是否需要AppDomain?
- 9. AudioStreamBasicDescription中是否需要mBytesPerFrame?
- 10. JS Twitter部件總是創建換行符,需要同一行
- 11. 我是否需要將會話變量轉換爲字符串?
- 12. 是否需要轉換字符串的字節順序?
- 13. 符合協議,是否需要?
- 14. const是否需要類型說明符?
- 15. 點符號 - 是否需要參數?
- 16. Postfix recipient_delimiter是否需要多個字符?
- 17. 爲什麼`fgets()`需要一個* str,但是`getline()`需要一個** str參數?
- 18. 不需要換行符包括
- 19. 當需要換行符時替代JSON?
- 20. 需要額外換行字符
- 21. CSV線(),需要保留換行符
- 22. 是否需要LDT?
- 23. 是否需要AudioServicesDisposeSystemSoundID?
- 24. 是否需要my_require_once?
- 25. 是否需要user_photos?
- 26. UI_APPEARANCE_SELECTOR是否需要?
- 27. 是否需要UserController?
- 28. 是否需要glDisableClientState?
- 29. 是否需要main.cpp?
- 30. 是否需要DefaultAppPool?
爲什麼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