CArchive类对文件读写操作
做一个自动保存读取的小案例
界面如下,定义好关联变量
2个按钮的消息
void C文档串行化Dlg::OnBnClickedButton1()
{
UpdateData(TRUE);//获取数据
CFile file;
if (file.Open(_T("data.txt"), CFile::modeCreate | CFile::modeWrite) == FALSE)
return;
CArchive ar(&file, CArchive::store);//保存
ar << m_name << m_sex << m_age;//保存数据
ar.Flush();//刷新缓冲区
ar.Close();
file.Close();
}
void C文档串行化Dlg::OnBnClickedButton2()
{
CFile file;
if (file.Open(_T("data.txt"), CFile::modeRead) == FALSE)
return;
CArchive ar(&file, CArchive::load);//读取
ar >> m_name >> m_sex >> m_age;//读取数据
ar.Close();
file.Close();
UpdateData(FALSE);//显示数据
}
用CDocument简化上述操作
写一个类继承自CDocument
#include "pch.h"
#include "CMyDocument.h"
#include "文档串行化Dlg.h"
void CMyDocument::Serialize(CArchive& ar)
{
auto pDlg = (C文档串行化Dlg*)AfxGetMainWnd();
if (ar.IsStoring())
{
ar << pDlg->m_name << pDlg->m_sex << pDlg->m_age;
}
else
{
ar >> pDlg->m_name >> pDlg->m_sex >> pDlg->m_age;
}
}
主窗口定义该类成员
之前的2个按钮消息改成如下
void C文档串行化Dlg::OnBnClickedButton1()
{
UpdateData(TRUE);//获取数据
m_doc.OnSaveDocument(L"data.txt");//保存数据
}
void C文档串行化Dlg::OnBnClickedButton2()
{
m_doc.OnOpenDocument(L"data.txt");//读取数据
UpdateData(FALSE);//显示数据
}
执行效果跟之前一样
利用Serialize进一步简化
Serialize是继承自CObject的,所以主窗口也能使用
Dlg.cpp添加serialize消息
void C文档串行化Dlg::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
ar << m_name << m_sex << m_age;
}
else
{
ar >> m_name >> m_sex >> m_age;
}
}
CMydocument.cpp简化
#include "pch.h"
#include "CMyDocument.h"
#include "文档串行化Dlg.h"
void CMyDocument::Serialize(CArchive& ar)
{
auto pDlg = (C文档串行化Dlg*)AfxGetMainWnd();
pDlg->Serialize(ar);
}