【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;
}




  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Carchive 是一个MFC类,用于在计算机程序中对数据进行归档、存储和检索。它提供了对序列化对象和数据进行管理的功能。 Carchive 可以将对象和数据序列化到文件或内存缓冲区,并可以根据需要进行反序列化以恢复对象和数据。它支持多种存储格式,如二进制、文本和XML。使用Carchive,可以轻松地将复杂的对象层次结构保存到文件中,并在需要时进行检索和重新加载。 Carchive 提供了一组成员函数,用于操作数据的序列化和反序列化。它们包括 Serialize、Read、Write 和 GetFileCarchive 类似于一个桥梁,将程序中的数据和对象与存储设备连接起来。它提供了在存储设备上读取和写入数据的方法,使得程序能够从存储设备中加载数据,并将数据保存到存储设备中。 与Carchive相对应的是Csocket,它是一个用于网络编程的MFC类。Csocket 提供了与网络通信相关的功能,例如创建套接字、连接到远程主机、接收和发送数据等。 使用Csocket,可以轻松地实现客户端和服务器之间的通信。它支持多种通信协议,如TCP和UDP。通过Csocket,程序可以与远程主机建立连接,并在连接上进行数据传输。 Csocket 提供了一组成员函数,用于初始化套接字、连接远程主机、发送和接收数据等操作。它还提供了一些事件和回调函数,以便程序能够处理与网络通信相关的事件。 总之,Carchive 和 Csocket 是MFC提供的两个有用的类。Carchive 可以帮助程序对数据进行归档和检索,而Csocket 则提供了与网络通信相关的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值