在文档/视图架构的程序中,框架中的视图负责显示信息,文档类(CDocument)则负责存储信息。一个文档类中的信息可以被多个视图类使用。
CDocument类内部调用了归档类(CArchive),后者采用一种序列化的存储架构,即以“流”的形式进行数据的存取。
CArchive类没有基类,它是对CFile类的简单封装,其中重载了“<<”、“>>”操作符函数,使得使用更简洁。
1. 使用CFile类进行数据存储
传统的数据存储方式,一般先将数据定义到一个结构体中,在以结构体为单元利用CFile对象进行循环读/写。
struct SData
{
UINT nNumb;
char sName[20];
COleDateTime join;
}
CString pathname="./Users.dat";
CFile file;
if (file.Open(pathname,CFile::modeCreate | CFile::modeWrite))
{
AfxMessageBox("保存出错!");
return;
}
SData s;
int i=0,nCount=m_list.GetItemCount();
CString str;
while(i<nCount)
{
s.nNumb=atoi(m_list.GetItemText(i,0));
m_list.GetItemText(i,1,s.sName,sizeof(s.sName));
s.join.ParseDate(m_list.GetItemText(i,2));
file.Write(&s,sizeof(s));//循环写入结构体
++i;
}
2.使用CArchive类进行数据存储
CFile file;
if (file.Open(pathname,CFile::modeCreate | CFile::modeWrite))
{
AfxMessageBox("保存出错!");
return;
}
//通过一个处于打开状态的文件,构造一个归档类对象
CArchive ar(&file,CArchive::store);
int i=0,nCount=m_list.GetItemCount();
//必须先把信息总数保存,以供读取时使用
ar<<nCount;
CString str;
while(i<nCount)
{
int nNumb=atoi(m_list.GetItemText(i,0));
CString sName=m_list.GetItemText(i,1);
COleDateTime time;
time.ParseDate(m_list.GetItemText(i,2));
ar<<nNumb<<szName<<time;//循环写入结构体
++i;
}
可以看出,不用事先定义一个固定大小的结构体用于组织数据,直接以序列的形式存储,使得不会浪费多余的空间。
3.使用CDocument类进行数据存储
//事先添加一个CDocument的派生类CDoc
//定义对象
CDoc m_doc;
//使用
m_doc.OnSaveDocument(pathname);
//添加并修改主对话框的序列化函数,将2中的代码封装。
//修改CDoc的序列化函数,在其中调用主对话框的序列化函数