zoukankan      html  css  js  c++  java
  • 【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
    ",p1->GetName(), p1->GetAge());
    	printf("name:%s,age:%u
    ",p2->GetName(), p2->GetAge());
    	delete p1; p1 = NULL;
    	delete p2; p2 = NULL;	
    
    	return 0;
    }
    
    



  • 相关阅读:
    轻松理解https,So easy!
    都 9102 年了,一起来攻克 Linux 吧!
    8种常见SQL错误用法,你中招了吗?
    如何写出让同事无法维护的代码?
    Spring Boot 2.1.6 发布了!
    推荐一款 MyBatis 开发神器,为简化而生!
    vs2015制作一个超级简单的MVC项目
    解析ASP.NET WebForm和Mvc开发的区别
    asp.net 的 web form 过时了吗
    Asp.net的WebForm的落后技术
  • 原文地址:https://www.cnblogs.com/james1207/p/3331345.html
Copyright © 2011-2022 走看看