バイナリデータの入出力

バイナリデータの入出力

最終ファイルとしてCSVなどに書き出したり読み込む場合は、fputsやfgetsを使えばいいのです。

しかし、一時的にデータをファイルに記憶しておきたい場合はfputsやfgetsを使うのはこのましくありません。

なぜなら、いちいちバイナリデータからANCIIデータへ変換しているからです。

この変換に時間がかかるので、一時的にデータを保管する場合はバイナリデータのまま扱うのが有効です。

ここでは、バイナリデータの入出力について解説します。

バイナリデータの入出力で使用する命令

バイナリデータの入出力では

size_t fread(void *バッファ, size_t サイズ, size_t 数値, FILE *ストリーム);

size_t fwrite(void *バッファ, size_t サイズ, size_t 数値, FILE *ストリーム);

前者は、「ストリーム」で指定したファイルから「サイズ」バイトの大きさのオブジェクトを「数値」個読み込んで「バッファ」にいれます。

後者は、「ストリーム」で指定したファイルへ「バッファ」から「数値」個読んで「サイズ」バイトの大きさのオブジェクトを保存します。

プログラム

では、int型の配列1,2,3,4をファイルに保存して、読み込んでみるプログラムを組んでみます。

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

int data[4]={1,2,3,4};

int main(void){
	int i;
	FILE *fp;

	//書き込み処理
	if((fp=fopen("myfile","wb"))==NULL){
		printf("ファイルを開けませんでした\n");
		exit(1);
	}
	for(i=0;i<4;i++){
		if(fwrite(&data[i],sizeof(int),1,fp)!=1){	//data[i]を書き込む
			printf("書き込みエラー\n");
			exit(1);
		}
	}
	fclose(fp);

	//読み込み処理
	if((fp=fopen("myfile","rb"))==NULL){
		printf("ファイルを開けませんでした\n");
		exit(1);
	}
	for(i=0;i<4;i++){
		if(fread(&data[i],sizeof(int),1,fp)!=1){
			printf("読み込みエラー\n");
			exit(1);
		}
	}
	fclose(fp);

	//配列表示
	for(i=0;i<4;i++){
		printf("%d\n",data[i]);
	}
	return 0;
}

実行すると以下のように表示されます。

1
2
3
4

はじめに配列dataをmyfileにバイト形式で書き込み(wb)、その後、dataへファイルから読み込んでいます。

sizeof()は括弧内のデータ型のサイズをバイト形式で返します。

メモリに置けないくらい大きなデータの場合に、バイナリファイルで保管することは有効なので積極的に使ってみましょう。

著者:安井 真人(やすい まさと)