★ファイル操作(バイナリファイル3)★


今回はバイナリファイルへ配列データや構造体データを読み書きします。

まずは配列データの書き込みから書いていきます。

配列を準備して、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
続行するには何かキーを押してください・・・

これで基本的な読み書きの説明は終わりです。

次はバイナリの特性を使ったファイルの使い方を説明します。


次へ

戻る

目次へ