このエントリーをはてなブックマークに追加


バイナリファイルの書き込みと読み込み・fopen,fwrite,fread

C言語によるバイナリファイルの読み込みおよび書き込みのサンプルコードを以下に記します。
サンプルコードの内容は、構造体の内容をファイルに出力するサンプルコードとファイルを読み込み構造体にセットするサンプルコードから構成されています。


スポンサーリンク

関連記事

共通ヘッダーファイル

書き込み、読み込みのサンプルコードで使用するヘッダーファイルは以下の通りです。

filepkt.h (改行コードLF)

#ifndef __PKT_H__
#define __PKT_H__

struct PKT {
    int a;
    int b;
    int c;
};

#endif

バイナリファイルの書き込みサンプルコード

バイナリファイルの書き込みサンプルコードは以下の通りです。

filebin-write.c (改行コードLF)

サンプルコードは、構造体に値をセットしファイルに出力しています。

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

#include "pkt.h"

int main(void)
{
    int i;
    struct PKT pkt[3];
    FILE *fp = NULL;

    pkt[0].a =   1; pkt[0].b =   2; pkt[0].c =   3;
    pkt[1].a =  10; pkt[1].b =  20; pkt[1].c =  30;
    pkt[2].a = 100; pkt[2].b = 200; pkt[2].c = 300;

    for(i=0; i<3; i++) {
        printf("pkt[%d].a = %d\n", i, pkt[i].a); 
        printf("pkt[%d].b = %d\n", i, pkt[i].b); 
        printf("pkt[%d].c = %d\n", i, pkt[i].c);
    }

    fp = fopen("data.dat", "wb");
    if (fp == NULL) {
        perror("fopen() error!");
        exit(EXIT_FAILURE);
    }

    /* output to data.dat file */
    if (fwrite(&pkt, sizeof(pkt), 1, fp) != 1) {
        perror("fwrite() error!");
        fclose(fp);
        exit(EXIT_FAILURE);
    }

    /* file close */
    if (fp != NULL) {
        fclose(fp);
        fp = NULL;
    }

    return 0;
}

バイナリファイルの読み込みサンプルコード

バイナリファイルの読み込みサンプルコードは以下の通りです。

filebin-read.c (改行コードLF)

サンプルコードは上記のbin-write.cで出力されたバイナリファイルを読み込み、構造体にセットしています。

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

#include "pkt.h"

int main(void)
{
    int i;
    struct PKT pkt[3];
    FILE *fp = NULL;

    fp = fopen("data.dat", "rb");
    if (fp == NULL) {
        perror("fopen() error!");
        exit(EXIT_FAILURE);
    }

    if (fread(&pkt, sizeof(pkt), 1, fp) != 1) {
        perror("fwrite() error!");
        fclose(fp);
        exit(EXIT_FAILURE);
    }

    if (fp != NULL) {
        fclose(fp);
        fp = NULL;
    }

    for(i=0; i<3; i++) {
        printf("pkt[%d].a = %d\n", i, pkt[i].a); 
        printf("pkt[%d].b = %d\n", i, pkt[i].b); 
        printf("pkt[%d].c = %d\n", i, pkt[i].c);
    }

    return 0;
}

ファイルの書き込み読み込みの実行結果

以下のように2つのCサンプルコードをコンパイルし実行した結果を記します。

$ gcc bin-write.c -o bin-write
$ ./bin-write 
pkt[0].a = 1
pkt[0].b = 2
pkt[0].c = 3
pkt[1].a = 10
pkt[1].b = 20
pkt[1].c = 30
pkt[2].a = 100
pkt[2].b = 200
pkt[2].c = 300

上記によりdata.datが作成されています。
またhexdumpコマンドで内容を確認してみます。

$ ls -l data.dat 
-rw-r--r-- 1 sakura sakura 36  8月 10 22:36 data.dat
$ hexdump -C data.dat
00000000  01 00 00 00 02 00 00 00  03 00 00 00 0a 00 00 00  |................|
00000010  14 00 00 00 1e 00 00 00  64 00 00 00 c8 00 00 00  |........d.......|
00000020  2c 01 00 00                                       |,...|
00000024

次に読み込みのCサンプルコードをコンパイルし実行します。
構造体に内容がセットされているのが確認できます。

$ gcc bin-read.c -o bin-read
$ ./bin-read 
pkt[0].a = 1
pkt[0].b = 2
pkt[0].c = 3
pkt[1].a = 10
pkt[1].b = 20
pkt[1].c = 30
pkt[2].a = 100
pkt[2].b = 200
pkt[2].c = 300

以上、C言語によるバイナリファイルの書き込みと読み込みのCサンプルコードでした。


スポンサーリンク

添付ファイル: filebin-read.c 535件 [詳細] filebin-write.c 655件 [詳細] filepkt.h 618件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2015-03-20 (金) 21:01:00