CArchive體會

第一次使用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);


}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章