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

MFC 創建文本文件完整指南:CFile 模式標誌與 Unicode 寫入細節

     編輯:程式設計疑難解答

核心需求

使用 MFC 創建一個空的文本文件(`.txt`),支持 Unicode 內容寫入。

標準代碼模板


CString strPath = _T("E:\\Cache\\new.txt");
CString strText = _T("Hello, MFC!\r\n第二行內容");

// 1. 打開文件:modeCreate(不存在則創建) | modeWrite(寫入) | modeNoTruncate(可選,不截斷)
CFile file;
if (!file.Open(strPath, CFile::modeCreate | CFile::modeWrite | CFile::typeBinary)) {
    AfxMessageBox(_T("文件創建失敗"));
    return;
}

// 2. 寫入 Unicode 簽名 (BOM: 0xFEFF),讓記事本正確識別編碼
WORD unicodeBOM = 0xFEFF;
file.Write(&unicodeBOM, sizeof(WORD));

// 3. 寫入字符串內容(寬字符)
file.Write(strText, strText.GetLength() * sizeof(TCHAR));

// 4. 關閉句柄
file.Close();

關鍵點解析

標誌/步驟作用注意事項
modeCreate文件不存在時創建若文件存在則打開,指針在開頭
modeWrite寫入權限需配合 modeRead 讀寫共享
typeBinary二進制模式避免 `\n` 自動轉 `\r\n`,手動控制換行
寫入 BOM (0xFEFF)標識 UTF-16 LE 編碼記事本/編輯器依賴 BOM 識別 Unicode
sizeof(TCHAR)Unicode 下為 2 字節配合 GetLength() 計算字節數

進階:CStdioFile 文本模式簡化寫法


CStdioFile file;
if (file.Open(strPath, CFile::modeCreate | CFile::modeWrite | CFile::typeText)) {
    file.WriteString(_T("第一行\r\n")); // 自動處理換行、編碼(ANSI)
    file.WriteString(strText);
    file.Close();
}
  • typeText:文本模式,自動 `\n` ↔ `\r\n` 轉換,**但默認寫入 ANSI (MBCS)**,Unicode 項目下需配合 `CFile::typeBinary` 手動寫 BOM + 寬字符。
  • 現代項目建議**統一 UTF-8**:用 `CFile::typeBinary` 寫入 UTF-8 BOM (EF BB BF) + `CStringA` (UTF-8 編碼) 內容,跨平台兼容性最佳。

避坑清單

  1. 路徑字符串雙反斜杠 `\\` 或單正斜杠 `/`。
  2. 目錄不存在時 `Open` 失敗,需先 `SHCreateDirectoryEx` 遞歸創建目錄。
  3. 寫入後必須 `Close()`,否則數據停留在緩衝區,文件為空或損壞。
  4. 異常處理:用 `CFileException` 捕獲磁盘滿、權限不足等錯誤。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved