用CArchive类和CFile类存储普通类或结构

网上看到别人实现,自己小试了一下

要存储的类定义如下:

/***********************Myclass.h**********************************/

class CMyclass
{
public:
 CMyclass(void);
 virtual ~CMyclass(void);
public:
 CString xuehao;//学号
 CString xingming;//姓名
 void Serialize(CArchive& ar);
};

 

/************************Myclass.cpp*********************************/

#include "StdAfx.h"
#include "./myclass.h"

CMyclass::CMyclass(void)
{
}

CMyclass::~CMyclass(void)
{
}

void CMyclass::Serialize(CArchive& ar)
{
 if(ar.IsStoring())
 {
  ar <<xuehao <<xingming;
 }
 else
 {
  ar >>xuehao >>xingming;
 }
}

/************************使用*********************************/

class CCArchiveClassDlg : public CDialog
{

.......................

public:
 CEdit m_editctrl1;
 CEdit m_editctrl2;
 CMyclass m_information;
 afx_msg void OnBnClickedBnSave();
 afx_msg void OnBnClickedBnOpen();

..................

};

 

void CCArchiveClassDlg::OnBnClickedBnSave()
{
 // TODO: 在此添加控件通知处理程序代码
 CString str1;
 CString str2;
 this->m_editctrl1.GetWindowText(str1);
 this->m_editctrl2.GetWindowText(str2);
 
 this->m_information.xuehao = str1;
 this->m_information.xingming = str2;
 
 CFile file;
 if(file.Open("123",CFile::modeCreate|CFile::modeWrite))
 {
  CArchive ar(&file,CArchive::store);
  this->m_information.Serialize(ar);

 

//脱离与文件的关联

ar.close();

//关闭文件,顺序不能颠倒,会出错的

file.close();
  
 }
 else
 {
  MessageBox("打开文件失败!");
 }
}

 

void CCArchiveClassDlg::OnBnClickedBnOpen()
{
 // TODO: 在此添加控件通知处理程序代码
 CString str1;
 CString str2;

 CFile file;
 if(file.Open("123",CFile::modeRead))
 {
  CArchive ar(&file,CArchive::load);
  m_information.Serialize(ar);

//脱离与文件的关联

ar.close();

//关闭文件,顺序不能颠倒,会出错的

file.close();
  this->m_editctrl1.SetWindowText(m_information.xuehao);
  this->m_editctrl2.SetWindowText(m_information.xingming);
 }
 else
 {
  MessageBox("打开文件失败!");
 }

}

 

其实不必弄个Serialize函数在这儿,直接用CArchive函数输入输出,可这样封装一下的确省了一点,不用每次对把要存储的类成员变量存储一遍,还是有点用

你可能感兴趣的:(File,存储)