使用 CArchive 向文本文件寫入 CString 等數據,打開 txt 發現除數字外均為亂碼。開發環境 VS2013 預設 Unicode 字符集。
CArchive 預設以二進制格式序列化對象,會寫入類型信息、長度前綴等元數據,並非純文本。若以文本編輯器打開,自然顯示亂碼。此外,Unicode 建構下 CString 內部為 wchar_t,直接序列化會寫入雙字節字符,若文件以 ANSI 模式打開更會錯位。
CFile cf;
cf.Open(_T("data.dat"), CFile::modeCreate | CFile::modeReadWrite | CFile::typeBinary);
CArchive ar(&cf, CArchive::store);
ar << m_aSno << m_aName << m_aMajor ...;
ar.Close();
cf.Close();
// 讀取時同樣用 CArchive::load
優點:保留類型信息,讀寫對稱,支援複雜對象圖。缺點:文件不可直接人工閱讀。
CStdioFile file;
file.Open(_T("data.txt"), CFile::modeCreate | CFile::modeWrite | CFile::typeText);
file.WriteString(m_aSno + _T("\t") + m_aName + _T("\t") + ... + _T("\n"));
file.Close();
優點:生成可讀文本,便於調試與跨平台交換。缺點:需自行處理字段分隔、轉義與類型轉換。
CArchive 無流操作符 << "\n" 語義,寫入換行請改用 CString 拼接或 WriteString。Format 格式化後再寫入,或使用 iostream 配合 setw。CFile::Open 旗標包含 CFile::typeBinary(二進制)或 CFile::typeText(文本)。store 與 load 兩個 CArchive,會導致指針位置混亂。SeekToEnd,讀取前 SeekToBegin。CString 即 CStringW,序列化後文件為 UTF-16LE,文本編輯器需支援該編碼。