【VC编程技巧】文件☞2.3CArchive的用法

系统 2807 0

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;

}




  


 


 

【VC编程技巧】文件☞2.3CArchive的用法


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论