我用CArchive进行文件的读写,现在想修改其中的某一行,于是我声明了两个CArchive
对象,基于同一个CFile对象,一个读,一个写。先从文件中读入,然后读入的数据是否
满足条件,若满足,则紧接着用另一个CArchive对象写入新数据,若不满足,则把原来
的数据再写回去。但是好像有问题,两个CArchive对象声明的时候,如果是store的在
前面,则可以添加,但是会直接添加到文件结尾,如果声明时load的那个在前面,则添
加了文件没有变化。请问为什么会这样呢?是因为缓冲区吗?另外请问各位大神可以怎样
解决这个问题呢?谢谢各位~
void Modify::OnClickedIdbModify()
{
// TODO: Add your control notification handler code here
if (!m_mComp || !m_mEng || !m_mMath || !m_mGym || m_mName == "" || m_mSno == "" || m_mMajor == ""){
MessageBox(_T("请先进行搜索再尝试更改!"), _T("错误"));
return;
}
MessageBox(_T("您正尝试更改一名学生的信息!\r\n确认更改请单击'确定',否则请单击'取消'"),
_T("警告"), MB_ICONEXCLAMATION | MB_OKCANCEL);
UpdateData();
CFile cf;
if (!cf.Open(_T("D:\\SIMS.txt"),
CFile::modeCreate | CFile::modeNoTruncate | CFile::modeReadWrite | CFile::typeBinary)){
#if def_DEBUG
afxDump << "unable to open file" << "\n";
exit(1);
#endif
}
CArchive cas(&cf, CArchive::store);
CArchive cal(&cf, CArchive::load); //能否成功写入似乎与声明的顺序有关
CString temp;
CString sno;
int flag = 1;
while (flag){
cal >> sno;
cal.ReadString(temp); //先把这一行分两部分读入
if (m_mSno == sno){ //再判断读入的sno是否满足条件
UpdateData();
cas << sno << m_mName << m_mMajor << m_mComp << m_mMath << m_mEng << m_mGym;
temp.Format(_T("\r\n"));
cas << temp;
flag = 0; //若满足,则把对话框中新获得的数据在这一行覆盖原数据
}
else{ //若不满足,则把刚刚读入的原数据重新写回去
cas << sno;
cas.WriteString(temp);
}
} //继续下一行的读入与判断
cas.Close();
cal.Close();
cf.Close();
}
各位大神帮帮忙,小弟初学MFC,想做一个修改文件中某行数据的功能。谢谢!