2014-10-31 31 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