Usar os operadores CArchive <<
e >>
CArchive
fornece operadores << e >> para escrever e ler tipos de dados simples, bem como CObject
s de e para um arquivo.
Para armazenar um objeto em um arquivo por meio de um arquivo
O exemplo a seguir mostra como armazenar um objeto em um arquivo por meio de um arquivo:
CArchive ar(&theFile, CArchive::store); WORD wEmployeeID = 78; ar << wEmployeeID;
Para carregar um objeto de um valor armazenado anteriormente em um arquivo
O exemplo a seguir mostra como carregar um objeto de um valor armazenado anteriormente em um arquivo:
CArchive ar(&theFile, CArchive::load); WORD wEmployeeID; ar >> wEmployeeID;
Normalmente, você armazena e carrega dados de e para um arquivo por meio de um arquivo nas funções Serialize
de classes derivadas CObject
, que você deve ter declarado com a macro DECLARE_SERIALIZE. Uma referência a um objeto CArchive
é passada para sua função Serialize
. Você chama a função IsLoading
do objeto CArchive
para determinar se a função Serialize
foi chamada para carregar dados do arquivo ou armazenar dados no arquivo.
A função Serialize
de uma classe derivada serializável CObject
normalmente tem a seguinte forma:
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
}
}
O modelo de código acima é exatamente o mesmo daquele que o AppWizard cria para a função Serialize
do documento (uma classe derivada de CDocument
). Esse modelo de código ajuda você a escrever um código mais fácil de examinar, pois o código de armazenamento e o código de carregamento sempre devem ser paralelos, como no exemplo a seguir:
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;
}
A biblioteca define os operadores <<
e >>
para CArchive
como o primeiro operando, e os seguintes tipos de dados e tipos de classe como o segundo operando:
BYTE
CObject*
COleCurrency
COleDateTime
COleDateTimeSpan
COleVariant
CString
CTime
e CTimeSpan
Double
DWORD
Float
Int
LONG
POINT
e CPoint
RECT
e CRect
SIZE
e CSize
WORD
Observação
Armazenar e carregar CObject
s por meio de um arquivo morto requer consideração extra. Para obter mais informações, consulte Armazenar e carregar CObjects por meio de um arquivo.
Os operadores CArchive
<<
e >>
sempre retornam uma referência ao objeto CArchive
, que é o primeiro operando. Isso permite encadear os operadores, conforme ilustrado abaixo:
archive << m_strName << m_wAge;