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

在文档/视图架构的程序中,框架中的视图负责显示信息,文档类(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的序列化函数,在其中调用主对话框的序列化函数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值