kagamihogeの日記

kagamihogeの日記です。

openとread

Cでファイル入出力するやり方はいろいろあるが、今回はバイナリ読み出しが必要なので低水準ファイル入出力を使うことに。
やはり、原理を理解してはいても失敗するものはするものだなぁと改めて思ってしまいました。

失敗内容の概要

とりあえず、コードはこんな感じ。思い切り端折ってはいるけど、教科書通りのやり方。

fd = open(argv[1], O_RDONLY);
while (1){
read_size = read(fd, buf, sizeof(buf));
if ( read_size == 0 ){
break;
}
}

で、このコードがどうも上手く動かない。
現象は、read_sizeを見るとbufサイズ分読まずにまちまちのバイトしか読んでこない、途中に読み飛ばされるバイトがある、200数バイト以降が読み出されない、等。

原因

原因は至極簡単で、読み出しモードがバイナリになっていなかった。


fd = open(argv[1], O_RDONLY|O_BINARY);

読み込み対象のファイルのバイナリを覗いて、読み出されないバイトを見ると、値は「0D」。0Dはアスキーコードでは制御文字のCR・・・。MSDNにはこう書いてあるので、基本的にこういう場合バイナリモードにしないとマズイ。

データ ファイルは通常、テキスト モードで処理されます。

他の原因も結局コレに起因してました。

いわゆる凡ミスよな・・・。反省しきりです。