Files

在文件末尾添加新行有什麼意義?

  • August 12, 2021

一些編譯器(尤其是 C 或 C++ 編譯器)會給您以下警告:

No new line at end of file

我認為這將是 C 程序員獨有的問題,但 github 在送出視圖中顯示了一條消息:

\ No newline at end of file

對於 PHP 文件。

我理解這個執行緒中解釋的預處理器,但這與 PHP 有什麼關係?是同一include()件事還是與\r\nvs\n主題有關?

在文件末尾換行有什麼意義?

這不是在文件末尾添加額外的換行符,而是不刪除應該存在的換行符。

在unix 下,文本文件由一系列組成,每行都以換行符( \n) 結尾。因此,非空且不以換行符結尾的文件不是文本文件。

應該對文本文件進行操作的實用程序可能無法很好地處理不以換行符結尾的文件;例如,歷史上的 Unix 實用程序可能會忽略最後一個換行符之後的文本。GNU實用程序有一個對非文本文件表現得體的策略,大多數其他現代實用程序也是如此,但您可能仍然會遇到缺少最後換行符的文件的奇怪行為¹。

在 GNU diff 中,如果一個被比較的文件以換行符結束,而另一個則不是,請注意這一事實。由於 diff 是面向行的,它不能通過為其中一個文件儲存換行符而不為其他文件儲存換行符來指示這一點——換行符對於指示diff 文件中每一行的開始和結束位置是必要的。所以 diff 使用這個特殊的文本\ No newline at end of file來區分一個沒有以換行符結尾的文件和一個以換行符結尾的文件。

順便說一句,在 C 上下文中,源文件同樣由一系列行組成。更準確地說,翻譯單元在實現中被視為一系列行,每行必須以換行符結尾(n1256 §5.1.1.1)。在 Unix 系統上,映射很簡單。在 DOS 和 Windows 上,每個 CR LF 序列 ( \r\n) 都映射到換行符 ( \n; 這是在這些作業系統上讀取作為文本打開的文件時總是發生的情況)。有一些作業系統沒有換行符,而是有固定或可變大小的記錄;在這些系統上,從文件到 C 原始碼的映射引入了一個\n在每條記錄的末尾。雖然這與 unix 沒有直接關係,但這確實意味著如果您將缺少最後換行符的 C 源文件複製到具有基於記錄的文本文件的系統中,然後將其複制回來,您最終會得到不完整的最後一行在初始轉換中被截斷,或者在反向轉換期間附加了一個額外的換行符。

¹範例:GNU sort 的輸出總是以換行符結尾。因此,如果文件foo缺少最後的換行符,您會發現sort foo | wc -c報告的字元比cat foo | wc -c.

引用自:https://unix.stackexchange.com/questions/18743