我的程序貌似因为一行代码非法操作,为什么?
BOOL CMessagesMenuDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Set the icon for this dialog. The framework does this automatically
// when the application 's main window is not a dialog
SetIcon(m_hIcon, TRUE);// Set big icon
SetIcon(m_hIcon, FALSE);// Set small icon
CenterWindow(GetDesktopWindow());// center to the hpc screen
// TODO: Add extra initialization here
SetWindowPos(&wndTopMost,0,0,320,240,SWP_SHOWWINDOW);
CString strTemp1,strTemp2,strTemp3;
CMessagesMenuDlg m1,m2,m3;
m1.OnPrepareMeasureCheck();
m2.OnWaitMeasureCheck();
m3.OnSaveDataCheck();
CFile mFile1;
if(mFile1.Open(L "\\Storage Card\\Radio1.TXT ",CFile::modeRead) == 0)
return 0;
else
{
CArchive ar1(&mFile1,CArchive::load);
ar1 > > strTemp1;//为什么不可以?
ar1.Close();
}
mFile1.Close();
if( strTemp1.GetLength() > 0)
{
//AfxMessageBox(L "8600 ");
((CButton *)GetDlgItem(IDC_CHECK1))-> SetCheck(1);
}
return TRUE; // return TRUE unless you set the focus to a control
}
运行后,弹出一个错误对话框,关闭此对话框后又弹出一个对话框说 *****.exe程序非法操作,而,当我把ar1 > > strTemp1;去掉就不会弹出任何错误,但,也就无法读出文件的内容了。 大家帮看看这个程序的问题出在哪,真的是在这行么? 这个读文件方法以前用都没出现这个问题,当然,以前没在OnInitDialog()中用过。
谢谢大家!
[解决办法]
file.Read(&BUFF,size);
为什么不直接用CFile自带的呢?
[解决办法]
通过存档存储及加载 CObject 需要额外注意。在某些情况下,应调用对象的 Serialize 函数,其中,CArchive 对象是 Serialize 调用的参数,与使用 CArchive 的“ < <”或“> > ”运算符不同。要牢记的重要事实是:CArchive 的“> > ”运算符基于由存档先前写到文件的 CRuntimeClass 信息构造内存中的 CObject。
因此,是使用 CArchive 的“ < <”和“> > ”运算符还是调用 Serialize,取决于是否需要加载存档基于先前存储的 CRuntimeClass 信息动态地重新构造对象。在下列情况下使用 Serialize 函数:
反序列化对象时,预先知道对象的确切的类。
反序列化对象时,已为其分配了内存。
警告 如果使用 Serialize 函数加载对象,也必须使用 Serialize 函数存储对象。不要使用 CArchive 的“ < <”运算符先存储,然后使用 Serialize 函数进行加载;或使用 Serialize 函数存储,然后使用 CArchive 的“> > ”运算符进行加载。
总之,如果可序列化的类将嵌入的 CObject 定义为成员,则不应使用该对象的 CArchive 的“ < <”和“> > ”运算符,而应调用 Serialize 函数。同时,如果可序列化的类将指向 CObject(或从 CObject 派生的对象)的指针定义为成员,但在自己的构造函数中将其构造为其他对象,则也应调用 Serialize。