C言語での構造体バイナリ読み書き:ファイル操作を関数化して1レコード単位で扱う方法

C言語関連

C言語でのバイナリファイル操作は、構造体をそのまま書き込んだり読み込んだりできるので、データの保存や読み込みが効率的に行えます。この記事では、構造体を1レコード単位で読み込み、出力を関数化する方法を解説します。

1レコードとは何か

1レコードとは、ファイル中のデータの単位のことです。構造体配列の場合、1レコードは1つの構造体に対応します。行数とは関係なく、バイナリファイル上では連続したメモリブロックとして保存されます。

構造体をバイナリファイルに書き込む関数の作成

構造体を書き込む際は、fwriteを使うのが一般的です。1レコードずつファイルに書き込むよう関数化すると、複数の構造体配列に対応できます。

#include <stdio.h>

struct SEITO {
    char name[32];
    short classnumber;
    short attendnumber;
};

void write_record(FILE *fp, struct SEITO *s) {
    fwrite(s, sizeof(struct SEITO), 1, fp);
}

バイナリファイルから構造体を読み込む関数

読み込みもfreadを用います。1レコードずつ読み込むことで、複数の構造体データを順に取得できます。

int read_record(FILE *fp, struct SEITO *s) {
    return fread(s, sizeof(struct SEITO), 1, fp);
}

main関数での使用例

出力用と読み込み用の関数を作ったら、main関数ではファイルを開き、書き込みと読み込みを呼び出すだけで簡単に扱えます。

int main() {
    struct SEITO arr[3] = { {"レナ",23,25}, {"タカシ",24,12}, {"ミカ",23,7} };
    FILE *fp = fopen("test1.bin", "wb");
    if (!fp) return -1;
    for(int i=0;i<3;i++) write_record(fp, &arr[i]);
    fclose(fp);

    fp = fopen("test1.bin", "rb");
    if (!fp) return -1;
    struct SEITO temp;
    while(read_record(fp, &temp)) {
        printf("名前:%s クラス:%d 出席番号:%d\n", temp.name, temp.classnumber, temp.attendnumber);
    }
    fclose(fp);
    return 0;
}

まとめ

1レコードとは構造体単位のデータのことで、fwrite/freadを使えばバイナリファイルに構造体を簡単に書き込んだり読み込んだりできます。関数化することで、出力と読み込みを分け、再利用性の高いコードを作ることができます。

コメント

タイトルとURLをコピーしました