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