シリアライズ第5回〜可変長の配列データを読み書き〜


目次に戻る


貫徹の後なのでちょと今日は簡潔に終わらせて頂きます。
 
アプリケーションを作っているとたいてい「サイズの決まっていないデータ群」いわゆる可変長の配列というものが登場します。このタイプのデータをファイルに保存する主な方法は二つあります。
  1. 配列サイズを書き込む

  2. 配列の大きさをあらかじめファイルに書き込み、その後に続いて配列の要素を全て書き込む方法です。
    利点はプログラムがすっきりすること。ファイルアクセスが早いこと。
    欠点は配列の大きさを調べる事が難しいデータ構造(圧縮データ等)の保存には向かないと言うこと。
     
  3. フラグを使う

  4. ファイルからXXというデータを読み込んだらデータを読み込み、YYというデータを読み込んだら終わりにする、という方式です
    利点はデータの追加が比較的容易に行える事。
    欠点は読み書き部分のプログラムが複雑になること。データの読み込み、解析に時間がかかること。
どちらが特に優れているとは言い難く、場面場面で使い分けていく事になると思います。前者の配列サイズを書き込む方式はintやchar等の単純なデータ配列を書き込む際によく使われ、後者のフラグを使う場合は構造体やクラスの配列を読み書きする場合に多く用いられます。
配列サイズを書き込む方式で配列データの保存をする
/*
 * c:\work\data5.bin というファイルが作成されます。
 */
#include <stdio.h>

#define FILENAME    "c:\\work\\data5.bin"

int data[10] = {0,1,2,3,4,5,6,7,8,9};    /* 保存されるデータ */

int main()
{
    FILE *fp = fopen( FILENAME , "wb" );   /* ファイルを開く。エラー処理は省略。 */
    int length = sizeof( data ) / sizeof( data[0] );

    /* 配列サイズを書き込む */
    fwrite( &length , sizeof( length ) , 1 , fp );

    /* 配列本体を書き込む */
    fwrite( data , sizeof( data[0] ) , length , fp);

    /* ファイルを閉じる */
    fclose( fp );

    return 0;
}

 
配列サイズを書き込む方式で保存されたファイルからデータを読み込む
/*
 * c:\work\data5.bin というファイルを使う。
 */
#include <stdio.h>

#define FILENAME    "c:\\work\\data5.bin"

int data[100];   /* 多めにデータ領域を確保しておく */

int main()
{
    FILE *fp = fopen( FILENAME , "rb" );   /* ファイルを開く。エラー処理は省略 */
    int length;
    int i;

    /* 配列サイズを読み込む */
    fread( &length , sizeof( length ) , 1 , fp );

    /* 配列本体を読み込む */
    fread( data , sizeof( data[0] ) , length , fp );

    /* ファイルを閉じる */
    fclose( fp );

    /* 読み込んだ内容を表示 */
    printf( "length = %d\n",length);
    for( i=0 ; i<length ; i++ ){
        printf( "data[%d] = %d\n" , i , data[i] );
    }

    return 0;
}

フラグを使う読み書きの方法は明日紹介します。

目次に戻る