配列を用いたセーブとロード
土谷 正則
ここでは、配列を用いたセーブとロードを説明します。(この方法はメモに書き出さない、書き出せない場合に有効で、ロード時も前回の値を再び数値として扱う事が出来ます。)しかし、データは作ったプログラムによって変化するので、今回は、セーブとロードに用いる関数や、ちょっとしたテクニックについて記述します。応用に関してはサンプルプログラム参考に行ってください。
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); //bufをAnsiString型に変換しtempに代入
//このときtempに余分なデータがある場合temp = temp.Delete(1,8)といった記述で何文字目から何文字目まで削ることが出来ます。
x=temp.ToDouble(); //tempをdouble型のxに代入
for (i=0;i<=x;i++){ //for文の繰り返し回数を決めるために、あらかじめデータを残しておく事が重要です。
fin>> X >> Y >> Z;
y[i]=Y;
z[i]=Z;
} //ファイルより値を取り出し配列に格納しています。
fin.close(); //ファイルを閉じています。
4.ロード時に配列に格納した値をメモやグラフに書き込めばロード完了です。
注意、なるべくファイルを開いている間は作業をさせないため、配列を用いています。ファイルを閉じてから、表示などの処理をしましょう。