問題

私はここの誰もが、すべてのテキストファイルが改行で終わるはずの広告に精通していると仮定します。私はこの "ルール"を何年も知っていましたが、私はいつも疑問に思っていました - なぜですか?

  ベストアンサー

これは であるため、POSIX 標準が という行を定義する方法です。

3.206 ライン
0 以上の non- 文字と終端の 文字のシーケンス。

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

端末エミュレータで作業する場合、このガイドラインには少なくとも1つの難しい利点があります。すべてのUnixツールはこのコンベンションを期待し、それを使用します。たとえば、catでファイルを連結すると、改行で終了したファイルは、

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

また、前の例では、コマンドラインにファイルを表示するとき(moreなど)、newline-enterminatedファイルが正しいディスプレイになります。不適切に終了したファイルが文字化けしている可能性があります(2行目)。

一貫性のために、このルールに従うことは非常に役に立ちます。


それについて考えてみてください:行が改行で終了しない場合、cat のようなコマンドを有用にするのはずっと難しいです。

  1. それぞれのファイルのスタートは新しい行に置かれます。
  2. 上記のb.txtc.txtの間の例のように、2つのファイルの最後と最初の行をマージできますか?

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

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


さて、POSIX準拠でないシステム(現在はほとんどWindowsです)では、ポイントはmootです:ファイルは一般的に改行で終わらず、例えば行の(非公式)定義は「改行で区切られたテキスト」である可能性があります(強調)。これは完全に有効です。ただし、構造化されたデータ(プログラミングコードなど)では、解析が最小限に複雑になります。一般的には、パーサがPOSIX定義で書き直されなければならないことを意味します。パーサがもともとPOSIXの定義を念頭に置いて書かれている場

  同じタグがついた質問を見る

fileunixtext-filesnewline