EOFの怪
Windowsのコマンドプロンプトから使えるコマンドでcopyというのがあります。その名の通りファイルをコピーするためのコマンドです。基本的な書式は、例えば
copy a.txt b.txt
とするとa.txtをb.txtという名前でコピーします。
2個のファイルをくっつけて新しいファイルに書き出すこともできます。その場合次のように実行します。
copy a.txt+b.txt c.txt
こうすると例えばa.txtの中身が
aaa aaa
で、b.txtの中身が
bbb bbb
だった場合、c.txtの中身は
aaa aaa bbb bbb
となります。
ただ、このcopyコマンドには変な(?)仕様があります。それは「2個のファイルを結合して生成したファイルの末尾にはEOF(EndOfFile)が付加される」というものです。実験してみましょう。
まず上記のやり方でa.txtとb.txtを結合してc.txtを作ります。そしてそのc.txtをテキストエディタで開いてみます。
赤い矢印の部分が付加されたEOFです。ただの半角スペースに見えますが実際はそうではありません。黒地に青で[EOF]と表示されているのはエディタの機能による表示で、copyコマンドによって付加されたEOFとは違います。念のためバイナリデータを見てみることにします。
赤い矢印の部分にEOFのコード1Aが付加されています。ちなみに61はアルファベットのa、62はb、0Dと0Aが改行です(Windows系OSの場合)。
なぜこんなものが付加されるのかというのは、どうもMS-DOS以前からの名残りのようです。ファイルの終端を明示的に示す必要があって付けていたものが事情によって残されているみたいです。ソフトウェア資産の互換性の為とかそういうことでしょうか。
さて、このEOFですがつけていてもあまりいいことはなさそうなのでこれを付加させずにファイル同士を結合する方法です。方法は簡単で、copyの際に/b(バイナリモード)オプションをつけて実行します。
copy /b a.txt+b.txt c.txt
EOFが付加されません。バイナリものぞいてみます。
大丈夫みたいです。
特に理由もないけど昔からの慣習とか今さら変えられないとかそういうことって他にもいろいろあるんだろうなぁと思いました。