首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

MFC CArchive 修改文字檔特定行:全讀入記憶體再寫回最佳實踐

     編輯:程式設計綜合問答

核心問題

CArchive 配合 CFile::typeText 進行**循序讀寫**,**不支援**原地修改某一行 (插入/刪除/取代) 的隨機存取。嘗試同時開啟一個 load 一個 store 的 CArchive 共用同一 CFile,會導致緩衝區、檔案指標互相衝突,造成資料損毀或寫入失敗。

推薦做法:一次性讀入記憶體 → 修改 → 整體寫回

BOOL ModifyStudentRecord(CString targetSno, const Student& newData) {
    CFile file;
    if (!file.Open(_T("D:\\SIMS.txt"), CFile::modeRead | CFile::typeText)) {
        return FALSE;
    }

    // 1. 全部讀入 CStringArray
    CStringArray lines;
    CArchive arRead(&file, CArchive::load);
    CString line;
    while (arRead.ReadString(line)) {
        lines.Add(line);
    }
    arRead.Close();
    file.Close();

    // 2. 在記憶體中修改
    BOOL found = FALSE;
    for (INT_PTR i = 0; i < lines.GetCount(); ++i) {
        CString curLine = lines[i];
        // 解析學號 (假設第一欄為學號,逗號分隔)
        int commaPos = curLine.Find(',');
        if (commaPos != -1) {
            CString sno = curLine.Left(commaPos);
            if (sno == targetSno) {
                // 重建該行
                CString newLine;
                newLine.Format(_T("%s,%s,%s,%d,%d,%d,%d"),
                    newData.sno, newData.name, newData.major,
                    newData.comp, newData.math, newData.eng, newData.gym);
                lines.SetAt(i, newLine);
                found = TRUE;
                break;
            }
        }
    }
    if (!found) return FALSE;

    // 3. 整體寫回 (覆蓋原檔)
    if (!file.Open(_T("D:\\SIMS.txt"), CFile::modeCreate | CFile::modeWrite | CFile::typeText)) {
        return FALSE;
    }
    CArchive arWrite(&file, CArchive::store);
    for (INT_PTR i = 0; i < lines.GetCount(); ++i) {
        arWrite.WriteString(lines[i]);
        arWrite.WriteString(_T("\r\n")); // 明確換行
    }
    arWrite.Close();
    file.Close();
    return TRUE;
}

優勢

  • 邏輯簡單:避開檔案指標、緩衝區同步的複雜度。
  • 效能足夠:文字檔通常 < 10 萬行,記憶體佔用極小 (幾 MB),現代電腦瞬間完成。
  • 安全可靠:寫入失敗時原檔案未被破壞 (可先寫暫存檔再 MoveFileEx 替換)。

若檔案極大 (超過記憶體)

採用**暫存檔法**:開啟原檔讀取 + 建立暫存檔寫入,逐行處理,最後 DeleteFile 原檔 + MoveFile 暫存檔→原檔。同樣不需雙向 CArchive 共用 CFile。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved