MFC框架界面开发(四):文档类

来源:互联网 发布:萤火虫壁纸软件 编辑:程序博客网 时间:2024/06/06 12:23

在文档/视图架构的程序中,框架中的视图负责显示信息,文档类(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的序列化函数,在其中调用主对话框的序列化函数
原创粉丝点击