シリアライズ第2回 〜テキスト形式による保存&読み込み〜


目次に戻る


テキスト形式で変数値の保存、読み込みをする方法を説明します。
テキスト形式で変数値をファイルに保存する方法
/*
 * c\work\data1.txt というファイルに変数の値が保存されます。
 */
#include <stdio.h>

#define FILENAME    "c:\\work\\data1.txt"

int main()
{
    int data1 = 100;
    int data2 = 200;
    FILE *fp;    /* ファイル操作で使用する */
 
    /* ファイルを書き込み用にテキスト形式で開く */
    fp = fopen( FILENAME , "wt" );
 
    /* ファイルが正常に開けたかチェック */
    if( !fp ){
        printf("ファイルが開けませんでした\n");
        return -1;
    }
 
    /* data1とdata2の内容を保存する */
    fprintf( fp , "%d %d\n" , data1 , data2 );
 
    /* ファイルを閉じる */
    fclose( fp );
 
    return 0;
}

 
テキスト形式のファイルから変数値を読み込む方法
/*
 * c:\work\data1.txt というファイルからデータを読み込みます
 */
#include <stdio.h>
 
#define FILENAME    "c:\\work\\data1.txt"
 
int main()
{
    int data1,data2;
    char buff[81];   /* ファイルから読み込んだデータを一時的に蓄えておくバッファ */
    FILE *fp;    /* ファイル操作用に使用する変数 */
 
    /* ファイルを読み込みようにテキスト形式で開く */
    fp = fopen( FILENAME , "rt" );
 
    /* ファイルが正常に開けたかチェックする */
    if( !fp ){
        printf("ファイルが見つかりませんでした\n");
        return -1;
    }
 
    /* ファイルから1行分データを読み込む */
    fgets( buff , 80 , fp );
 
    /* 解析する */
    sscanf( buff , "%d %d" , &data1 , &data2 );
 
    /* 読み込んだ結果を表示 */
    printf("data1 = %d , data2 = %d\n",data1,data2 );
 
    return 0;
}
基本は上記のサンプルを応用する事でOKです。注意点としては文字列を保存する時にはちょっとした細工をする必要があるということです。
scanfシリーズではスペースを区切り文字として使用するため、ファイルに保存した文字列データの中にスペースが混じっている場合デフォルトの sscanf( buff , "%s" , mojiretu ); といった使い方では正常に読み込めないのです。
こういう場合の解決策を2つ紹介します。
  1. スペースや改行などの区切り文字が出ないようにする。
    変換処理を行うことでくり区切り文字が出ないようにすれば正常に読み書きができます。処理が面倒くさいのが難点。
  2. 1行全体を文字列として利用する。
    つまりsscanfは使用しないで、fgetsで読み込んだ文字列をそのまま文字列データとして使用する。欠点は改行がちゃんと読み込めないこと。


目次に戻る