1バイトのファイルを作成する
何をしたくて書いたもの?
同僚から1バイトのファイルを作成したいんだけど、なぜか2バイトになってしまう。原因がわからないと聞かれました。OSはLinuxです。
例えば以下のようなファイルを考えてみます。
tsuji@DESKTOP-DCISGC3:/tmp/gomi$ ls -l total 0 -rw-r--r-- 1 tsuji tsuji 2 Dec 27 20:39 hoge_1b.txt tsuji@DESKTOP-DCISGC3:/tmp/gomi$ cat hoge_1b.txt a
たしかに a
の1文字しかファイルに書き込んでいないのですが、ls -l
コマンドで確認すると2バイトと表示されています。
結論から言うと、これは改行コードによって1バイト消費しているためです。od
コマンドを利用すると、以下のように調べることができます。
tsuji@DESKTOP-DCISGC3:/tmp/gomi$ od -tx1 hoge_1b.txt 0000000 61 0a 0000002
od
はファイルを8進数や16進数でダンプするコマンドです。オプションがいろいろあり -tx1
とするとファイルの内容を1バイト単位で16進数で表示することができます。ファイルの中身を表示すると a
(16進数で 61
)の他に 0a
が表示されています。これは改行コードのLFを意味します。
vim
で操作する場合はデフォルトだと改行コードが付与されるので
tsuji@DESKTOP-DCISGC3:/tmp/gomi$ vim hoge_1b.txt :set bin noeol :w tsuji@DESKTOP-DCISGC3:/tmp/gomi$ ls -l hoge_1b.txt -rw-r--r-- 1 tsuji tsuji 1 Dec 27 20:48 hoge_1b.txt
などとして改行コードを追加しないようにする、などといった方法で改行コードをつけずにファイルを作成するとうまく動作します。もちろん echo -n
などといった方法もあります。
tsuji@DESKTOP-DCISGC3:/tmp/gomi$ echo -n a > hoge_1b.txt tsuji@DESKTOP-DCISGC3:/tmp/gomi$ ls -l hoge_1b.txt -rw-r--r-- 1 tsuji tsuji 1 Dec 27 20:49 hoge_1b.txt