技術メモ

技術メモ

ラフなメモ

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