C言語でのバイナリデータの扱い
バイナリデータを取り扱う際に、あれprintfとかで表示できないぞ。なぜだ?となったので備忘録としてまとめます。
まず、別アプリから作成されたログファイルを読み込みために、C言語標準ライブラリ関数のfreadを使います。
sample.c
# include <stdio.h>
size_t fread(void *buf, size_t size, size_t n, FILE *fp);
/*【引数】*/
/* void *buf 読み込みデータ格納先のポインタ */
/* size_t size 読み込みデータのバイト長さ */
/* size_t n 読み込みデータの数 */
/* FILE *fp FILEポインタ */
バイナリファイルを取り扱う上でファイルの型情報などのデータ構造を知った上で、利用する必要があります。ただ私自身なんとなくの理解で、このログファイルを扱っていたので表示したいデータはの一部はchar型の4文字、つまりchar(1byte * 4)4byteと思い込んでいましたので以下のようにコードを書いていました。
ahomatigai.c
char buf[5];
fread(buf, sizeof(char), 4, fp);
buf[4] = '¥0';
printf("%s", buf);
しかし、実際のデータ構造はchar文字ではなくlongの数だったので何も表示されなかったわけです。以下だと正しく表示されました。
ahokaramashi.c
long buf;
fread(&buf, sizeof(long), 1, fp);
printf("%ld", buf);
まとめ
かなり初歩的な間違いですが、データ構造が分からなかったり、バイナリファイルの生成処理を追えなかったり、今回のように思いこみがあると一瞬ん?となるのでまとめました。今回のバイナリファイルとは違ってデータの中に型情報が含まれたバイナリレイアウトもあるみたいですが、どちらにせよプログラマがデータの型情報を理解して取り扱う必要があると思います。