首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

MFC 日記應用程式:檔案儲存功能完整實作

     編輯:關於VC++

本文展示一個基於 MFC 文檔/視圖架構的日記程式儲存邏輯,涵蓋 CFileDialog 檔案選擇、CFile/CArchive 序列化存檔、以及狀態旗標管理。

核心儲存流程

  1. 從月曆控制項取得日期,構建預設檔名(如 2024-05-20.txt)
  2. 彈出「另存新檔」對話框,過濾 *.txt,啟用覆蓋提示
  3. 使用 CFile::modeCreate | modeReadWrite | shareExclusive 獨佔建立檔案
  4. 透過 CArchive::store 將編輯控制項內容 (m_sComment) 序列化寫入
  5. 更新儲存狀態旗標 bSave 與當前檔名 m_sFileName

關鍵代碼註解

void CDiaryDlg::OnButtonSave() {
    // 1. 取得日期構建預設檔名
    int iYear = m_cMonthView.GetYear();
    int iMonth = m_cMonthView.GetMonth();
    int iDay = m_cMonthView.GetDay();
    CString sFileName;
    sFileName.Format(_T("%d-%d-%d.txt"), iYear, iMonth, iDay);

    // 2. 設定檔案對話框
    CFileDialog dlg(FALSE, _T("txt"), sFileName,
        OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY,
        _T("文本文件(*.txt)|*.txt||"), this);
    dlg.m_ofn.lpstrTitle = _T("保存日記文件");

    // 3. 執行對話框並處理結果
    if (dlg.DoModal() == IDOK) {
        CString fileName = dlg.GetPathName();
        // 獨佔建立/開啟檔案
        CFile file(fileName,
            CFile::modeCreate | CFile::modeReadWrite | CFile::shareExclusive);
        // 序列化存檔
        CArchive ar(&file, CArchive::store | CArchive::bNoFlushOnDelete);
        UpdateData(TRUE); // 從控制項讀取資料到變數
        ar << m_sComment; // 寫入字串
        ar.Close();

        // 4. 更新狀態
        bSave = TRUE;
        m_sFileName = fileName;
    }
}

設計亮點與擴展建議

  • 註解掉的「直接存檔」分支:原碼保留了若 bSave 已真則直接覆寫原檔的邏輯,實作時可啟用以支援「儲存」與「另存新檔」區分
  • 錯誤處理增強:建議加入 try-catch(CFileException*) 捕捉磁碟滿、權限不足等異常
  • 編碼支援:若需儲存 Unicode,可改用 CStdioFile 配合 CFile::typeUnicode
  • 自動儲存:可結合 SetTimer 定期觸發無提示存檔

此範例展示了 MFC 序列化機制在簡單文本儲存場景的標準用法,代碼結構清晰,易於整合至 SDI/MDI 文檔類的 Serialize() 虛函數中,實現統一的存讀介面。

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