2012年03月25日

[C++]freadでバイナリデータを読み込む

今回はC++でバイナリデータを読み込む方法を紹介しよう。

バイナリデータの扱いは、プログラミングにおいて基本中の基本でありながらも最も重要な処理ともいえるのでしっかり理解しておきたいところだ。

まずはバイナリエディタを使って以下のようなサンプルデータを作成する。

binfile.dat
FF 00 00 FF FF 61 62 63 00 E3 81 82 E3 81 84 
E3 81 86 00 FF


上記ファイルのファイルレイアウトは以下の通りだ。

FF unsigned char(1byte) = 0xff = 255
00 00 FF FF long(4byte) = 0xffff0000 = -65536
61 62 63 00 char(4byte) = 0x61 0x62 0x63 0x00 = 'abc\0'
E3 81 82 E3 81 84 E3 81 86 00 char(10byte) = 0xe38182 0xe38184 0xe38186 0x00 = u'あいう\0'
FF unsigned char(1byte) = 0xff = 255


リトルインディアンなマシン(Intelプロセッサ)を前提にしているため、第二項目の「0000FFFF」は 0xffff0000 として扱われていることに注意が必要である。

C言語やC++でバイナリデータを読み込むには、stdio.h のfread関数を利用する。

size_t fread(const void* ポインタ, 
size_t 1アイテムのサイズ,
size_t アイテム数,
FILE* ファイルポインタ)


1アイテムのサイズ*アイテム数のバイト数分のデータを第一引数のポインタへ読み込む。戻り値はアイテム数である。アイテムが無かった場合は 0 が返る。

以下はプログラミング例だ。
先ほど作ったサンプルデータを読み込んで表示するだけの単純なプログラムである。

binfile.c
#include <stdio.h>
#include <stdlib.h>

int main(){
FILE* fp;
size_t num;
char* fname = "./binfile.dat";

/* =============== */
/* データ構造 */
/* =============== */
/* 第1項目: unsigned char 1byte */
unsigned char d1;
/* 第2項目: long 4byte */
long d2;
/* 第3項目: char 4byte */
char d3[4];
/* 第4項目: char 10byte (UTF-8) */
char d4[10];
/* 第5項目: unsigned char 1byte */
unsigned char d5;

/* ファイルのオープン */
if ((fp = fopen(fname, "rb")) == NULL) {
fprintf(stderr, "file open failed! : %s\n", fname);
exit(EXIT_FAILURE);
}

/* バイナリデータ読込 */
// 第1項目 0xff = 255
num = fread(&d1, sizeof(d1), 1, fp);
printf("d1:%d\n", d1, num);
// 第2項目 0xffff0000 = -65536
num = fread(&d2, sizeof(d2), 1, fp);
printf("d2:%d\n", d2, num);
// 第3項目 0x61 0x62 0x63 0x00 = 'abc\0'
num = fread(&d3, sizeof(d3), 1, fp);
printf("d3:%s\n", d3, num);
// 第4項目 0xe38182 0xe38184 0xe38186 0x00 = u'あいう\0'
num = fread(&d4, sizeof(d4), 1, fp);
printf("d4:%s\n", d4, num);
// 第5項目 0xff = 255
num = fread(&d5, sizeof(d5), 1, fp);
printf("d5:%d\n", d5, num);

/* ファイルのクローズ */
fclose(fp);

return EXIT_SUCCESS;
}


$ gcc binfile.c -o binfile.exe
$ binfile.exe


これをコンパイルし、実行してみると、、、

d1:255
d2:-65536
d3:abc
d4:あいう
d5:255


このように表示される。

さて、次回はバイナリデータの書き込みについて紹介したいと思う。


C++プログラミング入門
グレゴリー サティア ダウグ ブラウン
オライリー・ジャパン
売り上げランキング: 61971

PR:お買い物はAmazonで
posted by 寄り道退屈男 at 14:55 | Comment(0) | TrackBack(0) | C++