ファイルへの保存

Serialize( ) 関数

画像データは、直線の個数と m_lineIndex と座標データ m_points[100][2] のみです。このようなデータをファイルに保存するためには Document クラスの Serialize( ) 関数を用いる。

//////////////////////////////////////////////////////////////////////
// CLine1Doc シリアライゼーション
void CLine1Doc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
// TODO: この位置に保存用のコードを追加してください。
ar $ <<$ m_lineIndex;
for(int i=0; i $ <$ m_lineIndex; i++){
ar $ <<$ m_points[i][0];
ar $ <<$ m_points[i][1];
}
}
else
{
// TODO: この位置に読み込み用のコードを追加してください。
ar $ >>$ m_lineIndex;
for(int i=0; i $ <$ m_lineIndex; i++){
ar $ >>$ m_points[i][0];
ar $ >>$ m_points[i][1];
}
}
}

Serialize( ) 関数のパラメータはアーカイブ (文書) 型のクラスへのポインター ar である。アーカイブが保存用か、読み込み用かを調べるためには IsStoring( ) を使う。 C 言語の標準入出力には printf, scanf を使用するが、C++ では入出力演算子 , を使用する。

C 言語では , は 2 進表示したときの 桁ずらしの命令 (シフト命令) で使用され、C++ では C 言語の命令も使用することができるから、, には 2 重の意味があることになる。 C++ では同一の演算子、関数に複数の意味を持たせる(多重定義)ことができるが、当然前後関係から区別がつかないといけない。

またプログラム中で変数 i を使用するときに、初めて i が整数型の変数であることを宣言している箇所がある。このような構文は C 言語では当然文法エラーとなるが、 C++ では必要な場所で型宣言をするようになっている。 以上でプログラムを起動したときにファイル/名前をつけて保存、 ファイル/開く... などのメニューが有効となる。