配列を用いたセーブとロード

土谷 正則

ここでは、配列を用いたセーブとロードを説明します。(この方法はメモに書き出さない、書き出せない場合に有効で、ロード時も前回の値を再び数値として扱う事が出来ます。)しかし、データは作ったプログラムによって変化するので、今回は、セーブとロードに用いる関数や、ちょっとしたテクニックについて記述します。応用に関してはサンプルプログラム参考に行ってください。

1.ヘッダーにファイル入出力用の関数<fstream.h>を宣言しておきます。

(ファイルの入力のみなら<ifstream.h>、出力のみなら<ofstream.h>)

2.セーブ部分のプログラム
      SaveDialog1->Execute();   //セーブダイアログを開きます

      ofstream fout;            //クラスのオブジェクト(fout)を生成します。

      fout.open(SaveDialog1->FileName.c_str());   //ダイアログのファイル名をchar型で取り込み、ファイルを開きます。

      if (!fout) {

           MessageBox (Handle,"ファイルが開けませんでした。","警告",MB_OK);

           exit(1);

      }                         //ファイルが開けなかった場合の対策です。

      fout<<   x   <<endl;      //ファイルの一行目にxの値を書き込んでいます。この表記を繰り返す事によって、データを保存します。

      for (i=0 ; i<=99 ; i++){

              fout << i+1 <<"  "<< y[i] <<"  "<< z[i] <<"  \n";  //ここは保存したいデータによって変わります。

      }                        //ファイルにfor文を用いて一行一行書き込んでいます。

      fout.close();            //開いたファイルを閉じています。

3.ロードのプログラム(サンプルプログラムの保存データを見てください)
      OpenDialog1->Execute() ;   //オープンダイアログを開きます。

      ifstream fin;      //クラスのオブジェクト(fin)を生成します。

     char buf[10];

     AnsiString temp;

     fin.open(OpenDialog1->FileName.c_str());  //ファイルを開きます。

     fin.getline(buf,10);     //ファイルの一行目から10文字目までをbufに保存

     temp=AnsiString(buf);       //bufAnsiString型に変換しtempに代入

  //このときtempに余分なデータがある場合temp = temp.Delete(1,8)といった記述で何文字目から何文字目まで削ることが出来ます。

     x=temp.ToDouble();  //tempdouble型のxに代入

     for (i=0;i<=x;i++){     //for文の繰り返し回数を決めるために、あらかじめデータを残しておく事が重要です。

           fin>> X >> Y >> Z;

           y[i]=Y;

            z[i]=Z;

      }                       //ファイルより値を取り出し配列に格納しています。

    fin.close();  //ファイルを閉じています。

4.ロード時に配列に格納した値をメモやグラフに書き込めばロード完了です。

注意、なるべくファイルを開いている間は作業をさせないため、配列を用いています。ファイルを閉じてから、表示などの処理をしましょう。

実際のプログラム例