Usando os operadores CArchive << and >>
CArchive fornece << e >> operadores para ler e gravar tipos de dados simples assim como CObjects para e de um arquivo.
Para armazenar um objeto em um arquivo por meio de um arquivo morto
O exemplo a seguir mostra como armazenar um objeto em um arquivo por meio de um arquivo morto:
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;
Geralmente, você armazena e carregar dados para e de um arquivo por meio de um arquivo morto em funções de CObject- classes derivadas de Serialize , que deve ter declarado com a macro de DECLARE_SERIALIZE . Uma referência a um objeto de CArchive é transmitida à função de Serialize . Você chama a função de IsLoading do objeto de CArchive para determinar se a função de Serialize esteve chamada para carregar dados de um arquivo ou do repositório para o arquivo.
A função de Serialize de CObjectserializável - a classe derivada geralmente tem o seguinte formato:
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 acima do código é exatamente igual ao AppWizard cria para a função de Serialize do documento (se uma classe derivada de CDocument). Ajuda desse modelo de código você escreve o código que é mais fácil de revisão, porque o código para armazenar e o código de carga devem estar sempre 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 << e os operadores de >> para CArchive como o primeiro operando e os seguintes tipos de dados e a classe digite como o segundo operando:
CObject* |
SIZE e CSize |
float |
WORD |
CString |
POINT e CPoint |
DWORD |
BYTE |
RECT e CRect |
Double |
LONG |
CTime e CTimeSpan |
Int |
COleCurrency |
COleVariant |
COleDateTime |
COleDateTimeSpan |
|
Dica
Armazenar e carregar CObjects meio de um arquivo morto exigem consideração adicional.Para obter mais informações, consulte Armazenando e carregamento CObjects meio de um arquivo morto.
Os operadores de CArchive << e de >> sempre retornam uma referência ao objeto de CArchive , que é o primeiro operando. Isso permite que o encadeamento os operadores, como ilustrado abaixo:
archive << m_strName << m_wAge;