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的用法的更多相关文章

  1. VC编程技巧:IE控件的高级用法

    一.如何显示内存中的 HTML 网页 二.屏蔽 IE 控件的上下文菜单 三.扩展 HTML 脚本中的 external 对象 四.显示 HTML 样式的对话窗 五.执行 HTML 脚本 http:// ...

  2. 【VC编程技巧】窗口☞3.6以渐变效果加载对话框

    平时我们常常能够看到非常多应用程序启动过程非常酷.什么百叶窗.渐变,各种效果,今天我们看一下怎样在程序中添加这样的效果. 一.演示样例展示: watermark/2/text/aHR0cDovL2Js ...

  3. 【VC编程技巧】窗口☞3.5对单文档或者多文档程序制作启动画面

    (一)概要: 文章描写叙述了如何通过Visual C++ 2012或者Visual C++ .NET,为单文档或者多文档程序制作启动画面.在Microsoft Visual Studio 6.0中对于 ...

  4. 【VC编程技巧】窗口☞3.4利用bitmap改变对话框的背景。

    效果图: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2hlbl9qaW50/font/5a6L5L2T/fontsize/400/fill/I0JBQ ...

  5. VC多文档编程技巧(取消一开始时打开的空白文档)

    VC多文档编程技巧(取消一开始时打开的空白文档) http://blog.csdn.net/crazyvoice/article/details/6185461 VC多文档编程技巧(取消一开始时打开的 ...

  6. java命名规范和编程技巧

    一个好的java程序首先命名要规范. 命名规范 定义这个规范的目的是让项目中所有的文档都看起来像一个人写的,增加可读性,方便维护等作用 Package 的命名 Package 的名字应该都是由一个小写 ...

  7. [libgdx游戏开发教程]使用Libgdx进行游戏开发(11)-高级编程技巧 Box2d和Shader

    高级编程技巧只是相对的,其实主要是讲物理模拟和着色器程序的使用. 本章主要讲解利用Box2D并用它来实现萝卜雨,然后是使用单色着色器shader让画面呈现单色状态:http://files.cnblo ...

  8. BASH的保护性编程技巧

    BASH的保护性编程技巧   shell常用逻辑判断 -b file 若文件存在且是一个块特殊文件,则为真 -c file 若文件存在且是一个字符特殊文件,则为真 -d file 若文件存在且是一个目 ...

  9. 无插件Vim编程技巧

    无插件Vim编程技巧 http://bbs.byr.cn/#!article/buptAUTA/59钻风 2014-03-24 09:43:46 发表于:vim  相信大家看过<简明Vim教程& ...

随机推荐

  1. FZU2176---easy problem (树链剖分)

    http://acm.fzu.edu.cn/problem.php?pid=2176 Problem 2176 easy problem Accept: 9    Submit: 32Time Lim ...

  2. 大型分布式C++框架《三:序列化与反序列化》

    一.前言  个人感觉序列化简单来说就是按一定规则组包.反序列化就是按组包时的规则来接包.正常来说.序列化不会很难.不会很复杂.因为过于复杂的序列化协议会导致较长的解析时间,这可能会使得序列化和反序列化 ...

  3. 浅谈zygote服务中的设计思路

    zygote服务是Android启动和服务APK的核心服务,每个APK都是通过zygote启动,今日阅读它的源码学习到一个不错的设计思路. 首先看看一个APK通过zygote的启动流程: 按照一般的设 ...

  4. Linux 之 rsyslog 系统日志转发(转载)

    一.rsyslog 介绍 ryslog 是一个快速处理收集系统日志的程序,提供了高性能.安全功能和模块化设计.rsyslog 是syslog 的升级版,它将多种来源输入输出转换结果到目的地,据官网介绍 ...

  5. php防sql注入、xss

    php自带的几个防止sql注入的函数http://www.php100.com/html/webkaifa/PHP/PHPyingyong/2013/0318/12234.html addslashe ...

  6. psp个人软件过程需求文档

    1.  业务需求 1.1 应用背景 开发软件项目进度计划总是那么不准确,延期经常出现,跟可恨的是甚至无法给出一个相对比较明确的延迟时间.很大 因素在于分配给开发人员的完成时间与开发人员的实际完成时间有 ...

  7. Redis Install

    Redis 是一个高性能的key-value数据库. redis的出现,很大程度补偿了memcached这类keyvalue存储的不足,在部分场合可以对关系数据库起到很好的补充作用.它提供了Pytho ...

  8. android requestDisallowInterceptTouchEvent用途

    ViewPager来实现左右滑动切换tab.假设tab的某一项中嵌入了水平可滑动的View就会让你有些不爽,比方想滑动tab项中的可水平滑动的控件,却导致tab切换. 由于Android事件机制是从父 ...

  9. hexo博客的优化与配置——加入统计代码

    今天看着csdn博客的訪客数,就想给hexo博客也加入统计訪客的插件,上次折腾了个pacman主题,中间自带的是goole的统计,easy被墙,所以就想换一个统计工具,看了好多人用的都是cnzz的站长 ...

  10. Ftp实现文件同步

    通常在做服务器与服务器文件.服务器与本地文件同步时通过Ftp服务实现,下面就以服务器文件和本地同步为例,介绍一下Ftp同步文件:首先建立一个Ftp站点服务,基本身份验证登陆,端口号为默认的21:Ftp ...