怎么用MDI程序中的Serialize写文件?发现很奇怪的现象!
比如用 MFC 的 Wizard 建立一个 MyClass 的 MDI 应用程序。
里面会有一个 CMyClassDoc 和 CMyClassView 的类,对应每个子窗口的文档类和视图类。
其中 MyClassDoc.cpp 里面有个 Serialize 函数,对应着程序打开文件和保存文件的代码。
void CMyClassDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
// TODO: add storing code here
}
else
{
// TODO: add loading code here
}
}
但是我不是用 ar<< 这样的方法写文件。我的方法如下:
CFile * pFile = ar.GetFile();
char filePath[256];
strcpy(filePath, pFile->GetFilePath());
这样知道了文件路径,就用另一个类的成员函数写文件:
pDib->SaveFile(filePath);
其中 CDib * pDib 是在 CMyClassDoc.h 中声明 pDib 为 CMyClassDoc的私有成员。
pDib->LoadFile(filePath);是用来读文件,操作无误。
但是SaveFile写文件时发现一个奇怪的现象:
我用CFile写文件,函数的最后一句是MessageBox("!");它前一句是file.Close();
因此我可以看到写完后的文件,和期望准确无误。
但是一点击OK,也就是这样这个函数彻底结束了,那个写好的文件就变成0字节了。
我觉得很奇怪,莫非Serialize还涉及到什么别的操作,为什么把写好的文件截成0字节??
请赐教,谢谢!
问题点数:60、回复次数:2Top
1 楼vcmute(BCare4 H1Rest Good9!)回复于 2005-04-01 22:33:23 得分 60
BOOL CDocument::OnSaveDocument(LPCTSTR lpszPathName)
在Serialize后会执行以下语句,导致重新写入文件
saveArchive.Close();
ReleaseFile(pFile, FALSE);Top
2 楼rmryt(小R在线)回复于 2005-04-02 03:34:00 得分 0
那该怎么办呢?加了派生类的这个函数
BOOL CMyClassDoc::OnSaveDocument(LPCTSTR lpszPathName)
{
// TODO: Add your specialized code here and/or call the base class
return CDocument::OnSaveDocument(lpszPathName);
}
把 return CDocument::OnSaveDocument(lpszPathName); 这一句改为
return TRUE; 想屏蔽那个函数,结果连保存文件的方法都不执行了,怎么回事啊?Top




