テキストファイルはなぜ改行で終わるのでしょうか? 質問する

テキストファイルはなぜ改行で終わるのでしょうか? 質問する

ここにいらっしゃる皆さんは、すべてのテキスト ファイルは改行で終わるべきであるという格言をご存知だと思います。私は何年も前からこの「ルール」を知っていましたが、なぜなのかずっと疑問に思っていました。

ベストアンサー1

なぜならPOSIX標準ではこのように行を定義しています:

3.206 ライン
0 個以上の非 <newline> 文字のシーケンスと終了の <newline> 文字。

したがって、改行文字で終わらない「行」は実際の行とはみなされません。そのため、一部のプログラムでは、ファイルの最後の行が改行で終わらない場合にその行を処理できないことがあります。

この規則に従う利点は、すべての POSIX ツールがこれを想定して使用していることです。たとえば、 を含むファイルを連結する場合、改行文字 (およびそれ以下)catで終了するファイルは、( ) を含まないファイルとは異なる効果を持ちますa.txtc.txtb.txt

$ more a.txt
foo

$ more b.txt
bar
$ more c.txt
baz

$ cat {a,b,c}.txt
foo
barbaz

一貫性を保つためにこのルールに従います。そうしないと、デフォルトの POSIX ツールを扱うときに余分な作業が発生します。


別の見方をしてみましょう。行が改行で終了しない場合、次のようなコマンドをcat便利にすることは非常に困難です。ファイルを連結するコマンドを次のように作成するにはどうすればよいでしょうか。

  1. 各ファイルの先頭を新しい行に置きますが、これは95%の場合に望ましいことです。
  2. 上記の例のように、b.txtとの間の 2 つのファイルの最後の行と最初の行を結合できますc.txt

もちろん、これは解決可能ですが、 の使用をcatより複雑にする必要があります (位置コマンドライン引数を追加するなどcat a.txt --no-newline b.txt c.txt)。また、個々のファイルではなくコマンドが、他のファイルとどのように貼り付けられるかを制御するようになります。これは間違いなく便利ではありません。

… または、終了ではなく継続するはずの行をマークするために、特別なセンチネル文字を導入する必要があります。さて、これで、POSIX と同じ状況に陥ってしまいますが、逆になります (行終了文字ではなく行継続)。


さて、 POSIX に準拠していないシステム (現在では主に Windows)では、この点は意味がありません。ファイルは一般に改行で終わらず、行の (非公式の) 定義は、たとえば「改行で区切られたテキスト」などです (強調に注意)。これはまったく妥当です。ただし、構造化データ (プログラミング コードなど) の場合、解析が多少複雑になります。つまり、通常はパーサーを書き直す必要があります。また、パーサーが元々 POSIX 定義を念頭に置いて作成されている場合は、パーサーではなくトークン ストリームを変更する方が簡単な場合があります。つまり、入力の末尾に「人工的な改行」トークンを追加します。

おすすめ記事