CArchive の <<
および >>
演算子の使用
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 がドキュメントのSerialize
関数 (CDocument
から派生したクラス) に対して作成するものとまったく同じです。 このコード テンプレートは、次の例のように、格納コードと読み込みコードが常に並行しているため、レビューしやすいコードを記述するのに役立ちます。
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
用の <<
および >>
演算子が最初のオペランドとして、次のデータ型とクラス型が 2 番目のオペランドとして定義されます。
BYTE
CObject*
COleCurrency
COleDateTime
COleDateTimeSpan
COleVariant
CString
CTime
および CTimeSpan
Double
DWORD
Float
Int
LONG
POINT
および CPoint
RECT
および CRect
SIZE
および CSize
WORD
Note
アーカイブを使用した CObject
の格納と読み込みには、別途考慮が必要です。 詳細については、「アーカイブを通じた CObjects の格納と読み込み」を参照してください。
CArchive
の <<
および>>
演算子は常に、最初のオペランドである CArchive
オブジェクトへの参照を返します。 これにより、次に示す演算子を連結できます。
archive << m_strName << m_wAge;