2010-02-18 170 views
137

一些代碼風格的工具推薦這個,我記得看到一些unix命令行工具警告缺少空行。爲什麼建議在文件末尾有空行?

什麼是有一個額外的空行的原因是什麼?

+5

一些工具失敗,如果該文件不以回車結束工作進行。這不同於最後有一個空行(這將是2個換行符)。 – 2010-02-18 12:02:09

+0

文本編輯器Gedit和Nano(據報道Vim)會爲您保存的任何文檔添加一個空行。 – 2012-09-14 13:48:20

+1

你的意思是空行('\ n \ n')還是新行'\ n'? – 2014-09-13 20:10:41

回答

110

如果文本文件中的最後一行數據沒有以換行符或回車/換行符組合結尾,許多舊工具行爲不當。他們忽略該行,因爲它以^ Z(eof)結尾。

+0

感謝您的答案!任何可能會出現這種行爲的流行工具的例子? – cloudrave 2016-08-01 04:44:05

+2

@NickM幾乎所有采用文本輸入或讀取文本文件的POSIX/Unix命令行工具假定文件末尾都有一行結尾('\ n')。幾個文本編輯器,如Vim和幾個編譯器(特別是C++和Python)將發出警告。 (在C++的情況下,標準明確要求這樣做。) – greyfade 2016-11-26 08:08:12

28

除了在文本編輯器中移動到文件末尾時它是更好的光標位置這一事實。

在文件末尾添加一個換行符可以簡單地檢查文件是否被截斷。

+151

該文件可能被截斷,你永遠不會知道 – 2010-02-18 10:57:41

+1

第一部分是正確的,第二部分是不正確的。 – 2017-06-29 10:52:23

10

文件末尾會出現空行,以便輸入流的標準讀取知道何時終止讀取,通常會返回EOF以指示您已到達結尾。大多數語言都可以處理EOF標記。因爲這個原因,在DOS下,EOF標記是F6鍵或Ctrl-Z,對於nix系統,它是Ctrl-D。

大多數(如果不是全部的話)實際上會直接讀取EOF標記,以便運行時庫從輸入讀取的功能知道何時停止讀取。當您打開追加模式的流時,它將擦除EOF標記並將其寫過去,直到明確調用關閉時,它將在該點處插入EOF標記。

老工具正在等待一個空行,然後是EOF標記。如今,工具可以處理空行並忽略它。

+5

^D不是「EOF標記」。按^ D導致shell關閉前臺進程組正在讀取的管道的寫入端,以便從該管道讀取的數據返回EOF。沒有「EOF標記」。 – 2010-02-18 11:13:49

+0

@William Pursell你錯誤地將* NIX和Windows混爲一談。傳統的Windows/DOS絕對使用通常在大多數文件末尾嵌入的EOF標記(26,0x1a)作爲與古代CP/M(1983年以後使用CP/M的對象)的兼容性的保留。其他「fun」:'\ r \ n'而不是'\ n',DOS調用使用ASCIIZ和ASCII $混合。更糟的是,後來在Windows上通常會在大多數文本文件的開頭插入一個Unicode字節順序標記(BOM)。可愛的「獨特性」。 – Barry 2017-10-18 05:19:05

2

有些語言根據輸入行定義它們的輸入文件,其中每個輸入行是一系列由回車符終止的字符。如果他們的語法如此定義,那麼文件的最後一個有效行必須以回車結束。

7

此外,當您修改文件並在文件末尾添加一些代碼時 - diff(至少在標準配置中是git diff)會顯示您更改了最後一行,而您實際完成的唯一一件事 - 添加了一個換行符號。所以CVS報告變得不太方便。

21

如果您嘗試將兩個文本文件連接在一起,如果第一個以換行符結尾,則會更加快樂。

相關問題