ソースファイルの最後に空の行を含めることが推奨されるのはなぜですか?


232

一部のコードスタイルツールはこれを推奨しており、UNIXコマンドラインツールで空の行がないことに関する警告が表示されたことを覚えています。

空の行を追加する理由は何ですか?


7
ファイルが改行で終わっていない場合、一部のツールは機能しません。これは、最後に空の行(2つの改行)があるのとは異なります。
ウィリアムパーセル2010

2
空の行(\n\n)または新しい行を意味します\nか?
Ciro Santilli郝海东冠状病六四事件法轮功

13
catシェル上のファイルとその理由がわかります。ファイルが私のシェルのプロンプトを本来あるべき場所(行の先頭)以外の場所に表示する場合、私はおそらくあなたを憎むでしょう。;)
ThiefMaster 2014

2
この古い質問に出くわし、すべての答えが他のツールやシステムの欠点や欠点を正当化しようとしているとは信じられません。檻の中の5匹のサルについて話しなさい!:-D
Amos M. Carpenter

1
より良い(より一般的な)答えは、一般的にテキストファイルを再:: stackoverflow.com/questions/729692/...
ルーベンBartelink

回答:


188

テキストファイルのデータの最後の行が改行または改行/改行の組み合わせで終了していない場合、多くの古いツールは正しく動作しません。代わりに^ Z(eof)で終了しているため、その行は無視されます。


1
答えてくれてありがとう!この動作を示す可能性のある一般的なツールの例はありますか?
Nick Merrill、2016

8
@NickMテキスト入力またはテキストファイルの読み取りを行うほとんどすべてのPOSIX / Unixコマンドラインツール\nは、ファイルの終わりが行末()であると想定しています。Vimのようないくつかのテキストエディターといくつかのコンパイラー(特にC ++とPython)は警告を出します。(C ++の場合、規格はこれを明示的に要求しています。)
greyfade '26

5
だから、あなたが言っていることは...それはカーゴカルトです
Jaykul

それでも、最後の行にテキストを含めることができます\n\n。質問では空の行が言及されています。
jinawee

57

2つのテキストファイルを連結しようとする場合、最初のテキストファイルが改行文字で終わっていると非常に便利です。


38

テキストエディタでファイルの最後に移動すると、カーソル位置が適切になるという事実は別として。

ファイルの最後に改行があると、ファイルが切り捨てられていないことを簡単に確認できます。


221
ファイルは切り捨てられる可能性があり、knにさえなることはありません
Simon Nickerson

26

末尾のコンマがリストで許可されている理由と同じ理由でファイルに追加すると、より明確なdiffの引数を作成することもできます。

以下は、リンクされたリソースからコピーされます(および少しトリミングされます)。

変化:

s = [
  'manny',
  'jack',
]

に:

s = [
  'manny',
  'jack',
  'roger',
]

差分の1行の変更のみが含まれます。

  s = [
    'manny',
    'jack',
+   'roger',
  ]

これは、末尾のコンマが省略された場合の、より混乱する複数行の相違を打ち消します。

  s = [
    'manny',
-   'jack'
+   'jack',
+   'roger'
  ]

リンクのみの回答は、SOでは価値があるとは見なされません。帰属を維持しながら、ここに関連情報をコピーしてください。
isherwood

17

ファイルの終わりの空の行が表示されるので、入力ストリームからの標準の読み取りは、読み取りをいつ終了するかを認識します。通常、EOFを返して、最後に達したことを示します。大部分の言語はEOFマーカーを処理できます。DOSのもとでは、EOFマーカーはF6キーまたはCtrl-Z、* nixシステムの場合はCtrl-Dでした。

すべてではないにしても、ほとんどの場合、EOFマーカーまで実際に読み取られるため、ランタイムライブラリの入力から読み取る関数は、それ以上読み取りを停止するタイミングを認識します。Appendモードでストリームを開くと、closeが明示的に呼び出されてその時点でEOFマーカーが挿入されるまで、EOFマーカーがワイプされて書き出されます。

古いツールは、EOFマーカーが後に続く空の行を予期していました。現在、ツールは空の行を処理して無視できます。


6
^ Dは「EOFマーカー」ではありませんでした。^ Dを押すと、シェルはフォアグラウンドプロセスグループが読み取っていたパイプの書き込み側を閉じるため、そのパイプからの読み取りはEOFを返しました。「EOFマーカー」はありません。
ウィリアムパーセル

@William Pursell * NIXとWindowsを誤って融合させました。レガシーWindows / DOSは、ほとんどのファイルの最後に埋め込まれたEOFマーカー(26、0x1a)を絶対的に使用しました。その他の「楽しい」:\r\n代わりに\n、DOSはASCIIZとASCII $のミックスを使用して呼び出します。さらに悪いことに、後のWindowsでは通常、ほとんどのテキストファイルの先頭にUnicodeバイトオーダーマーク(BOM)を挿入します。素敵な「ユニークさ」。

9

また、ファイルを変更してファイルの終わりにコードを追加すると、diff(少なくとも標準構成ではgit diff)は最後の行を変更したことを示しますが、実際に行った唯一のことは改行記号を追加したことです。そのため、CVSレポートは不便になります。


5

一部の言語では、入力ファイルを入力行で定義しています。各入力行は、改行で終了する一連の文字です。文法がそのように定義されている場合は、ファイルの最後の有効な行も改行で終了する必要があります。


3

これは、テキストファイルの定義によるものです。UNIX環境で新しいテキストファイルを作成すると、そのファイルの内容は改行文字 '\ n'になります。

これがないと、ファイルは実際にはテキストファイルとして識別されません。ここで、このテキストファイルにコードを追加したら、テキストファイル自体定義するこの最初の新しい行は削除しません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.