Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

fread() / fwrite()

バイナリデータをファイルへ直接読み書きする関数です。テキストモードと異なり改行変換を行わないため、画像・音声・構造体データなどのバイナリファイルを正確に扱えます。

構文
// バイナリデータをファイルから読み込みます。
// 戻り値: 読み込んだブロック数(feof() や ferror() で確認します)。
size_t fread(void *ptr, size_t size, size_t count, FILE *stream);

// バイナリデータをファイルへ書き込みます。
// 戻り値: 書き込んだブロック数(count と異なる場合はエラーです)。
size_t fwrite(const void *ptr, size_t size, size_t count, FILE *stream);
引数一覧
引数概要
ptrデータを格納するバッファ(読み込み先)またはデータの先頭アドレス(書き込み元)です。
size1ブロックのバイト数です。構造体なら『sizeof(struct X)』を渡します。
count読み書きするブロック数です。
stream『"rb"』または『"wb"』で開いた FILE ポインタです。
サンプルコード
#include <stdio.h>
#include <stdlib.h>

typedef struct {
    int id;
    double score;
} Record;

int main(void) {
    // 構造体データをバイナリファイルに書き込みます。
    Record rec = {42, 98.5};
    FILE *fp = fopen("data.bin", "wb"); // バイナリ書き込みモードで開きます。
    if (fp == NULL) {
        perror("fopen");
        return EXIT_FAILURE;
    }
    size_t written = fwrite(&rec, sizeof(Record), 1, fp);
    if (written != 1) {
        fprintf(stderr, "書き込みに失敗しました。\n");
    }
    fclose(fp);

    // バイナリファイルから構造体データを読み込みます。
    Record rec2 = {0};
    fp = fopen("data.bin", "rb"); // バイナリ読み込みモードで開きます。
    if (fp == NULL) {
        perror("fopen");
        return EXIT_FAILURE;
    }
    size_t read_count = fread(&rec2, sizeof(Record), 1, fp);
    fclose(fp);

    if (read_count == 1) {
        printf("id = %d\n", rec2.id);       // 『id = 42』と出力されます。
        printf("score = %.1f\n", rec2.score); // 『score = 98.5』と出力されます。
    }
    return 0;
}
概要

ファイルを開く際はバイナリモード(『"rb"』『"wb"』『"ab"』)を必ず指定してください。テキストモードで開くと Windows 環境で改行コード('\n' ↔ "\r\n")の自動変換が行われ、バイナリデータが壊れます。

『fread()』の戻り値が要求した count より少ない場合は、ファイル末尾(EOF)またはエラーのどちらかです。『feof() / ferror()』で原因を切り分けてください。

複数ブロックをまとめて読み書きするとシステムコールの回数が減り、処理が高速になります。ファイル位置の操作は『fseek()』で行えます。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。