CArchive 演算子 << および >> の使用法
更新 : 2007 年 11 月
CArchive では、単純なデータ型および CObject をファイルに書き込んだり、ファイルから読み取ったりするときに、出力ストリーム演算子 (<<) および入力ストリーム演算子 (>>) を使用できます。
アーカイブを通じてオブジェクトをファイルに格納するには
アーカイブを通じてオブジェクトをファイルに格納する例を次に示します。
CArchive ar(&theFile, CArchive::store); WORD wEmployeeID = 78; ar << wEmployeeID;
ファイルに保存された値からオブジェクトを読み込むには
ファイルに保存された値からオブジェクトを読み込む例を次に示します。
CArchive ar(&theFile, CArchive::load); WORD wEmployeeID; ar >> wEmployeeID;
通常、アーカイブを介してデータをファイルに格納したり、ファイルから読み込んだりするのは、CObject 派生クラスの Serialize 関数です。この関数は DECLARE_SERIALIZE マクロを使って宣言しておく必要があります。Serialize 関数には CArchive オブジェクトへの参照が引数として渡されます。Serialize 関数が呼び出された目的 (ファイルからのデータの読み込み、またはファイルへのデータの格納) を調べるには、CArchive オブジェクトの IsLoading 関数を呼び出すことができます。
シリアル化可能な CObject 派生クラスの Serialize 関数の例を次に示します。
void CSerializableObj::Serialize( CArchive& archive )
{
// call base class function first
// base class is CObject in this case
CObject::Serialize( archive );
// now do the stuff for our specific class
if( archive.IsStoring() )
{
// TODO: add storing code here
}
else
{
// TODO: add storing code here
}
}
上記のコード テンプレートは、AppWizard がドキュメント クラス (CDocument の派生クラス) の Serialize 関数用に作成するものと同じです。このテンプレート コードを使うと、見直しやすいコードを記述できます。格納用のコードと読み込み用のコードは、常に並行に記述されるためです。次に例を示します。
void CEmployee::Serialize( CArchive& archive )
{
// call base class function first
// base class is CObject in this case
CObject::Serialize( archive );
// now do the stuff for our specific class
if( archive.IsStoring() )
archive << m_strName << m_wAge;
else
archive >> m_strName >> m_wAge;
}
ライブラリでは、CArchive の演算子 << および >> が第 1 オペランド、以下のデータ型やクラス型が第 2 オペランドとして定義されています。
CObject* |
SIZE および CSize |
float |
WORD |
CString |
POINT および CPoint |
DWORD |
BYTE |
RECT および CRect |
倍精度浮動小数点数型 |
LONG |
CTime および CTimeSpan |
Int |
COleCurrency |
COleVariant |
COleDateTime |
COleDateTimeSpan |
|
メモ : |
---|
アーカイブを通じて CObject の格納と読み込みを行うときは注意が必要です。詳細については、「アーカイブを通じた CObject の格納と読み込み」を参照してください。 |
CArchive クラスの演算子 << および >> は必ず、第 1 オペランドで指定した CArchive オブジェクトへの参照を返します。したがって、次のように演算子を連続して記述できます。
archive << m_strName << m_wAge;