ringView::OnEditChangemessages()
{
CMultiStringDoc* pDoc = GetDocument();
CTime now = CTime::GetCurrentTime();
CString changetime = now.Format(褻hanged at %B %d %H:%M:%S*);
pDoc->m_messages.SetMessage(1, CString(襍tring 1 *) + changetime);
pDoc->m_messages.SetMessage(2, CString(襍tring 2 *) + changetime);
pDoc->m_messages.SetMessage(3, CString(襍tring 3 *) + changetime);
pDoc->SetModifiedFlag();
Invalidate();
}
剩下的工作就是编写文档类的Serialize( )函数,这个函数将m_message数据对象存储到磁盘中。如程序清单8所示:
程序清单8 串行化数据对象
void CMultiStringDoc::Serialize(CArchive& ar)
{
m_messages.Serialize(ar);
if (ar.IsStoring())
{
}
else
{
}
}
读者可以看出,在串行化m_messages数据对象后,在文档类的Serialize( )函数中已经没什么需要做的了。请注意对m_messages的调用。Serialize( )把档案对象作为唯一的参量进行了传递。现在创建MultiString并测试它,它将会完成所期望的功能。
直接读写文件
尽管使用MFC内建的串行化功能是保存和加载数据的便捷方式,但是某些时候需要对文件处理过程有更多的控制权。例如,可能需要对用户的文件进行非连续的操作,某些需要I/O流、而Serialize( )函数和它相关的CArchive对象又不能进行处理的操作。在这种情况下,你可以几乎与在非Windows程序中完全一样来处理文件,直接对文件进行创建、读取和写入。即使需要深入到这个水平来进行文件处理,MFC也提供了帮助,尤其是可以使用CFile类和其派生类来直接处理文件。
CFile类
MFC的CFile类封装了所有在处理任意类型的文件时所需的函数。无论是希望进行通常的顺序的数据保存和加载还是希望构造一个随机访问文件,CFile都将支持。使用CFi1e类和老式的C方式的文件处理非常相似,但该类隐藏了一些繁杂工作的细节以使得此项工作快捷而又方便。例如,仅需一行代码就可以创建一个文件用作读取。表1列出了CFile类的成员函数和对它们的说明。
表1 CFile类的成员函数
函 数 说 明
Constructor 创建CFile对象。如果传递的是一个文件名,就打开该文件
Destructor 释放超出范围的CFile对象。如果文件已打开,则关闭它
Abort( ) 立即关闭文件而不管是否出错
Close( ) 关闭文件
Duplicate( ) 创建一个可复制的文件对象
Flush( ) 清除流中数据
GetFileName( ) 获取文件名
GetFilePath( ) 获取文件的全路径
GetFileTitle( ) 获取文件标题(不带扩展名的文件名)
GetLength( ) 获取文件长度
GetPosition( )&n