第一次使用CFile和CArchive讀取txt文件時,所遇到的問題: 直接讀取一個已經存在的文件時,用CArchive::>>CString無法讀取整行的字符串,所讀取的字符串超過了一個整行,而且其中有空格及回車符等等。 當換用CArchive::ReadString(CString)時,讀取的是亂碼。
當面對這個問題時,我也很煩躁。
瀏覽了一些blog後,得到的信息如下:
①CArchive可以讀取由CArchive寫入的txt字符串
②CArchive讀CString時,第一個字符會被處理爲的長度而不是讀一行
③貌似可以使用CStdioFile::ReadString來讀取一行。
從txt中讀取的字符,如果是多字節格式(MultiByte)的,讀入CString後會形成亂碼,需要用MultiByteToWideChar轉換爲寬字節(WideCode,Unicode)格式。
一個小例子:
CString對象str從File中讀取了所有的字符(此處本想只讀一行的,但沒有實現掉),之後轉爲Unicode,最後用wcstok_s來分隔。
CFile file(dlg_open.GetPathName(), CFile::modeRead);
CArchive ar(&file,CArchive::load);
m_map = new Map;
CString str;
ar.ReadString(str);
size_t nchars = MultiByteToWideChar(CP_ACP, 0, (LPSTR)(LPCTSTR)str, -1, 0, 0);
wchar_t * pUnicode;
pUnicode = new wchar_t[nchars + 1];
memset(pUnicode, 0, (nchars + 1)*sizeof(wchar_t));
MultiByteToWideChar(CP_ACP, 0, (LPSTR)(LPCTSTR)str, -1, (LPWSTR)pUnicode, nchars);
wchar_t delim = _T('\n');
wchar_t *next_token1 = NULL;
wchar_t* p = wcstok_s(pUnicode, &delim, &next_token1);
while (p != 0)
{
p = wcstok_s(0, &delim, &next_token1);
}