天天看點

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