0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

C言語 バイナリファイルを扱う時の注意

Posted at

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);

まとめ

かなり初歩的な間違いですが、データ構造が分からなかったり、バイナリファイルの生成処理を追えなかったり、今回のように思いこみがあると一瞬ん?となるのでまとめました。今回のバイナリファイルとは違ってデータの中に型情報が含まれたバイナリレイアウトもあるみたいですが、どちらにせよプログラマがデータの型情報を理解して取り扱う必要があると思います。

0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?