問題代碼
FILE *pFile = fopen("1.txt", "r");
TCHAR ch[100];
fread(ch, 1, 100, pFile); // 錯誤:第2參數應為元素大小
fclose(pFile);
MessageBox(ch); // 亂碼
根因分析
- fread 參數錯誤:
fread(ptr, size, count, stream) 中 size 應為單個元素字節數。TCHAR 在 Unicode 構建下為 wchar_t (2 字節),代碼傳 1 導致只讀取一半字節
- 文件編碼與構建配置不一致:文件若為 ANSI,Unicode 構建下需轉換;反之亦然
- MessageBox 參數類型:Unicode 構建需調用
MessageBoxW 或使用 _T 宏
修正代碼
// 1. 正確計算元素大小
FILE *pFile = fopen("1.txt", "r");
TCHAR ch[100];
fread(ch, sizeof(TCHAR), 100, pFile); // sizeof(TCHAR) 自動適配 ANSI/Unicode
fclose(pFile);
// 2. 確保字符串以 NULL 結尾
ch[99] = _T('\0');
// 3. 使用宏自動映射 MessageBoxA/W
MessageBox(NULL, ch, _T("標題"), MB_OK);
寫文件對應修正
FILE *pFile = fopen("1.txt", "w");
TCHAR ch[] = _T("測試字符串");
fwrite(ch, sizeof(TCHAR), _tcslen(ch), pFile); // 同樣使用 sizeof(TCHAR)
fclose(pFile);
關鍵最佳實踐
- 始終使用
sizeof(TCHAR) 而非硬編碼 1 或 2
- 配合
_T() / TEXT() 宏處理字符串字面量
- 文件 IO 建議顯式指定編碼 (如 UTF-16LE 加 BOM),或統一改用
std::fstream + std::wstring
- 調試時在 Watch 窗口查看內存原始值,確認是否為預期編碼