我的程序是基于对话框的,我重载了Serialize()函数
写没有问题
读有问题,错误提示框的文字为:“试图越过其尾端对一未命名文件进行读写”
附程序:
/* 保存 */
void CTestArchiveDlg::OnSave() 
{
CFile file;
CString FilePathName;
CString FileName;
CString FileExt;
CString str; CFileDialog dlg(FALSE,_T("STA"),_T("*.STA"),OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,_T("标签文件(*.STA)|*.STA|"));
if(IDOK==dlg.DoModal())
{
FilePathName = dlg.GetPathName();
FileName = dlg.GetFileName();
FileExt = dlg.GetFileExt(); FilePathName.MakeUpper();
FileExt.MakeUpper();
if(FileName.IsEmpty())
FileName="标签.sta";
else
{
if(dlg.GetFileExt().IsEmpty())
FilePathName=FilePathName+".sta";
else if(dlg.GetFileExt().Compare("STA")!=0)
{
FilePathName=FilePathName+".sta";
}
}
if(file.Open(FilePathName,CFile::modeWrite|CFile::modeCreate,NULL)==0)
{
str="创建文件"+FileName+"失败";
AfxMessageBox(str);
}
CArchive ar(&file, CArchive::store);
Serialize(ar);
ar.Close();
file.Close();
}
}/* 打开 */
void CTestArchiveDlg::OnOpen() 
{
CFile file;
CString FilePathName;
CString str;
theStamp.iStampCount=0;
theStamp.iStampID=-1;
FilePathName="";
theStamp.strFileName=""; CFileDialog dlg(TRUE,_T("STA"),_T("*.STA"),OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,_T("标签文件(*.STA)|*.STA|"));
/* 打开标签文件 */
if(IDOK==dlg.DoModal())
{
FilePathName = dlg.GetPathName();
FilePathName.MakeUpper();
if(file.Open(FilePathName,CFile::modeRead,NULL)==0)
{
str="打开文件"+FilePathName+"失败";
AfxMessageBox(str);
}
CArchive ar(&file, CArchive::load);
Serialize(ar);
ar.Close();
file.Close();
}
}
IMPLEMENT_SERIAL(CTestArchiveDlg,CObject,1) 
void CTestArchiveDlg::Serialize(CArchive& ar) 
{
UINT i;
CObject::Serialize(ar);
if (ar.IsStoring())
{
ar<<theStamp.iStampCount;
for(i=0;i<theStamp.iStampCount;i++)
ar<<theStamp.strStampName[i];
}
else
{
ar>>theStamp.iStampCount;
for(i=0;i<theStamp.iStampCount;i++)
ar>>theStamp.strStampName[i];
}
}

解决方案 »

  1.   

    theStamp是怎么定义的?肯定是ar<<进去的变量个数与ar>>出来的变量个数不一样。或顺序不一致。
      

  2.   

    //试试看void CTestArchiveDlg::Serialize(CArchive& ar) 
    {
    UINT i;

    //CObject::Serialize(ar); if (ar.IsStoring())
    {
    ar<<theStamp.iStampCount;
    for(i=0;i<theStamp.iStampCount;i++)
    ar<<theStamp.strStampName[i];
    }
    else
    {
    //对了, 你这读时,theStamp分配了内辰吗?
    ar>>theStamp.iStampCount;
    for(i=0;i<theStamp.iStampCount;i++)
    ar>>theStamp.strStampName[i];
    }
    }
      

  3.   

    ar>>theStamp.iStampCount;
    for(i=0;i<theStamp.iStampCount;i++)
        ar>>theStamp.strStampName[i];这样你肯定是不行的,因为你事先并不知道theStamp.strStampName数组的大小。
    所以你应该这样:
    ar>>theStamp.iStampCount;
    theStamp.strStampName = new CString[theStamp.iStampCount];//假设你的
                                                              //theStamp.strStampName
                                                              //是CString型数组
    for(i=0;i<theStamp.iStampCount;i++)
        ar>>theStamp.strStampName[i];用完了theStamp.strStampName记得要释放,比如在CTestArchiveDlg的析构函数里释放
    CTestArchiveDlg::~CTestArchiveDlg()
    {
       ...
       delete []theStamp.strStampName;
       ...
    }