今回はバイナリファイルへ配列データや構造体データを読み書きします。
まずは配列データの書き込みから書いていきます。
配列を準備して、fwrite関数でファイルへ書き込みます。
<sample program 124-01>
#include <stdio.h> #define DATA 10 int main(void) { int data[DATA] = { 202, 222, 178, 197, 216, 204, 167, 178, 217, 33 }; FILE* fp; fp = fopen("Test.txt", "wb"); if (fp == NULL) { printf("OPEN ERROR\n"); return 1; } fwrite(data, sizeof(int), DATA, fp); fclose(fp); return 0; } |
int型の配列があり、初期値を入れました。
ファイルをバイナリの書き込みモードで開き、fwrite関数で書き込んでいます。
ここでのfwrite関数は、
配列の先頭番地(data)からintサイズ10個分(DATA)のデータをfpへ書き込む
という意味です。
「テキストファイル」に配列内のデータを書き込む場合、ループを作ってfprintf関数で要素を1つずつ書き込んでいきます。
「バイナリファイル」の場合、データの先頭番地とバイト数、個数を指定するだけですのでループは使いません。
実行して「Test.txt」の中身を見てみましょう。
文字コード表を見れば、何となく分かりますよね。
※文字と文字の間に半角空白が3つ分ありますが、int型のデータのため(私の環境では)4バイト保存しているからです。
※ここを深く掘り下げると別の話になりますので、今は控えておきます。
次はこのデータを読み込む方法を説明します。
別のプロジェクトを作成し「Test.txt」をコピーしてください。
freadを使って、
指定された番地(data)から始まる領域へintサイズ10個分のデータをfpから読み込む
と書けば良いです。
<sample program 124-02>
#include <stdio.h> #define DATA 10 int main(void) { int data[DATA]; int i; FILE* fp; fp = fopen("Test.txt", "rb"); if (fp == NULL) { printf("OPEN ERROR\n"); return 1; } fread(data, sizeof(int), DATA, fp); fclose(fp); for (i = 0; i < DATA; i++) { printf("data[%d] = %d\n", i, data[i]); } return 0; } |
<実行結果>
data[0] = 202 data[1] = 222 data[2] = 178 data[3] = 197 data[4] = 216 data[5] = 204 data[6] = 167 data[7] = 178 data[8] = 217 data[9] = 33 続行するには何かキーを押してください・・・
fread関数で読み込む際もループは不要です。
次は構造体データの書き込みです。
構造体もテキストファイルだとメンバ変数1つ1つ別々に保存する必要がありますが、バイナリは一行で保存出来ます。
<sample program 124-03>
#include <stdio.h> typedef struct{ int a; int b; int c; } Sample; int main(void) { Sample sample = { 65, 66, 67 }; FILE* fp; fp = fopen("Test.txt", "wb"); if (fp == NULL) { printf("OPEN ERROR\n"); return 1; } fwrite(&sample, sizeof(Sample), 1, fp); fclose(fp); return 0; } |
構造体の番地も実体の前に「&」を付ければ良いだけです。
メンバ変数がいくつあってもこれ一行で保存出来ます。
テキストファイルの場合、
fprintf(fp, "%d\n", sample.a); fprintf(fp, "%d\n", sample.b); fprintf(fp, "%d\n", sample.c); |
とメンバ変数1つずつ書かなければなりません。
ファイルの中身を見ると↓のようになっています。
では、読み込みを作ります。
新しいプロジェクトを作り、データファイルをコピーしてください。
<sample program 124-04>
#include <stdio.h> typedef struct{ int a; int b; int c; } Sample; int main(void) { Sample sample; FILE* fp; fp = fopen("Test.txt", "rb"); if (fp == NULL) { printf("OPEN ERROR\n"); return 1; } fread(&sample, sizeof(Sample), 1, fp); fclose(fp); printf("a = %d\n", sample.a); printf("b = %d\n", sample.b); printf("c = %d\n", sample.c); return 0; } |
<実行結果>
a = 65 b = 66 c = 67 続行するには何かキーを押してください・・・
これで基本的な読み書きの説明は終わりです。
次はバイナリの特性を使ったファイルの使い方を説明します。