【VC编程技巧】文件☞2.3CArchive的用法
CArchive 对象提供了一个类型安全缓冲机制CArchive 对象提供了一个类型安全缓冲机制。用于将可序列化对象写入CFile 对象或从中读取可序列化对象。通常,CFile 对象表示磁盘文件;但是,它也可以是表示“剪贴板”的内存文件(CSharedFile 对象)。
CArchive允许以一个永久二进制(通常为磁盘存储)的形式保存一个对象的复杂网络,它可以在对象被删除时,还能永久保存。可以从永久存储中装载对象,在内存中重新构造它们。使得数据永久保留的过程就叫作“串行化”。
CArchive支持基本数据类型(BYTE、WORD、LONG、DWORD、float、double、int、short、char、unsigned CString),CObject派生的类对象,,同时也支持CSocket,CSocketFile。
构造 CArchive:
CArchive(
CFile* pFile,
UINT nMode,
int nBufSize = 4096,
void* lpBuf = NULL
);
参数:
pFile
为了使持久性数据的最终源或目标的 CFile 对象的指针。
nMode
指定的标志对象是否将填充或存储到存档。 nMode 参数必须具有下列值之一:
CArchive::load 从存档加载数据。 需要 CFile 仅读取权限。
CArchive::store 将数据保存到存档。 需要 CFile 写权限。
当存档析构函数调用时,CArchive::bNoFlushOnDelete 防止存档自动调用 Flush。 如果设置此标志,您负责显式调用 Close,在调用析构函数之前。 如果不,数据将损坏。
nBufSize
指定文件内部缓冲区的大小的整数,以字节为单位)。 请注意默认缓冲区大小为4,096字节。 如果您定期存档大型对象,您将提高性能,如果您使用的是文件缓冲区大小的多个的一个更大的缓冲区大小。
lpBuf
该范围 nBufSize用户提供的缓冲区的可选指针。 如果未指定此参数,存档从本地堆分配缓冲区并释放它,当销毁对象时。 存档不释放用户提供的缓冲区。
备注:
您不能使用 CFile 操作修改文件的状态,直到您关闭了存档。 任何此类操作将损坏存档的完整性。 在序列化时在+任何+时间可以访问文件指针的位置。获取存档文件对象从 GetFile 成员函数然后使用 CFile::GetPosition 功能。 您应在获取文件指针的位置之前调用 CArchive::Flush。
下面是示例代码(CArchiveDemo)
// Person.h: interface for the CPerson class. // ////////////////////////////////////////////////////////////////////// #if !defined(AFX_PERSON_H__B12B4253_72D0_49D4_98FE_88145950801B__INCLUDED_) #define AFX_PERSON_H__B12B4253_72D0_49D4_98FE_88145950801B__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 class CPerson : public CObject //继承CObject对象 { DECLARE_SERIAL(CPerson)//手动添加 private: CString m_strName; unsigned m_uAge; public: CPerson(); virtual ~CPerson(); VOID SetName(CString name); CString GetName(); VOID SetAge(unsigned age); unsigned GetAge(); virtual VOID Serialize(CArchive& ar);//重载CObject对象方法 }; #endif // !defined(AFX_PERSON_H__B12B4253_72D0_49D4_98FE_88145950801B__INCLUDED_)
// Person.cpp: implementation of the CPerson class. // ////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "CArchiveDemo.h" #include "Person.h" #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// IMPLEMENT_SERIAL(CPerson, CObject, 1)//手动去添加 CPerson::CPerson() { m_uAge = 0; } CPerson::~CPerson() { } VOID CPerson::SetName(CString name) { m_strName = name; } CString CPerson::GetName() { return m_strName; } VOID CPerson::SetAge(unsigned age) { m_uAge = age; } unsigned CPerson::GetAge() { return m_uAge; } VOID CPerson::Serialize(CArchive& ar) { if (ar.IsLoading())//加载 ar >> this->m_strName >> this->m_uAge; else ar << this->m_strName << this->m_uAge; }
// CArchiveDemo.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "CArchiveDemo.h" #include "Person.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // The one and only application object CWinApp theApp; using namespace std; int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) { //1>CArchive对基本类型支持 //CArchive写操作 CFile myfile("info.txt", CFile::modeCreate|CFile::modeReadWrite); CArchive ar_s(&myfile, CArchive::store); WORD wAge_s = 28; ar_s << wAge_s; ar_s.Close(); myfile.Close(); //CArchive读操作 myfile.Open("info.txt", CFile::modeRead); CArchive ar_l(&myfile, CArchive::load); WORD wAge_l = 0; ar_l >> wAge_l; ar_l.Close(); myfile.Close(); //2>CArchive对类对象支持 CPerson Zhang; Zhang.SetName("张三"); Zhang.SetAge(23); CPerson Li; Li.SetName("李四"); Li.SetAge(27); //CArchive写操作 CFile fperson("person_info.txt", CFile::modeCreate|CFile::modeWrite); CArchive ar_store(&fperson, CArchive::store); ar_store << &Zhang << &Li;//序列化写入 ar_store.Close(); fperson.Close(); //CArchive读操作 CPerson *p1 = NULL, * p2 = NULL; fperson.Open("person_info.txt", CFile::modeRead); CArchive ar_load(&fperson, CArchive::load); ar_load >> p1 >> p2;//序列化读入 ar_load.Close(); fperson.Close(); //打印以下读入数据 printf("name:%s,age:%u\n",p1->GetName(), p1->GetAge()); printf("name:%s,age:%u\n",p2->GetName(), p2->GetAge()); delete p1; p1 = NULL; delete p2; p2 = NULL; return 0; }