我用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,想做一個修改文件中某行數據的功能。謝謝!
文本文件替換一行沒有什麼高效的辦法,因為不是二進制文件。如果文件大小不是很大(100萬行以內),建議一次性讀取到內存,然後再輸出。