shigechi-64's diary

自由・自主・自立・自尊

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が付加されません。バイナリものぞいてみます。

大丈夫みたいです。
特に理由もないけど昔からの慣習とか今さら変えられないとかそういうことって他にもいろいろあるんだろうなぁと思いました。