unicode环境下用CFile读取txt的若干疑惑,该如何处理
来源:互联网 发布:男生保养脸部皮肤知乎 编辑:程序博客网 时间:2024/05/16 18:23
unicode环境下用CFile读取txt的若干疑惑
在vs2010下对一些文件的操作总是有好多疑问
unicade环境下以前的许多资料发现会出现异常结果,下面看看我的问题:
主要是用CFile读取txt出现乱码,我试了好几种方法,最后终于找到了解决方法,但只是方法,还有好多疑问。
目的其实就是读取txt文件,以前用CStdioFile读取的,但是遇到超级大的文件后发现其效率极其低下,就算一个5mb只有一行的txt文件其读取效率也是难以忍受。
以前用CStdioFile读取时也会乱码,但加入了这两段代码之后就没问题了
虽然可以正常读取,但是大文件就很慢了
于是就改用CFile,在查阅了一些资料后CFile读取txt成功了,但是却读出来的是乱码
后来试了很多方法,最后虽然成功了,但是还是很多问题。
先看看我的几个失败方法:
m_strContent是CString变量;m_strFilePath是文件路径
方法1:
结果是乱码
方法二:使用CArchive
很神奇的是只读取了一点点,txt里的内容是一串数字,如0.12345 0.3456 1.233 -1.345……这样的数字
它内容是.12345 0.3456 1.233 -1第一个0没了,然后5mb左右的文件就读到了十几个字符。
最后这个方法能正确解决
问题1:
这段代码有什么用呢?
问题2:(这是我比较想知道的)
CArchive为何会只读取到那么一点?
问题3:
WCHAR和char之间的区别是什么?
------解决方案--------------------------------------------------------
1.设置字符集,读取的时候好处理中文
2.可能对于空格等自动截取了
3.一个是UNICODE字符串,一个是ANSI字符串,两者之间需要编码转换
------解决方案--------------------------------------------------------
在vs2010下对一些文件的操作总是有好多疑问
unicade环境下以前的许多资料发现会出现异常结果,下面看看我的问题:
主要是用CFile读取txt出现乱码,我试了好几种方法,最后终于找到了解决方法,但只是方法,还有好多疑问。
目的其实就是读取txt文件,以前用CStdioFile读取的,但是遇到超级大的文件后发现其效率极其低下,就算一个5mb只有一行的txt文件其读取效率也是难以忍受。
以前用CStdioFile读取时也会乱码,但加入了这两段代码之后就没问题了
- C/C++ code
char* old_locale = _strdup( setlocale(LC_CTYPE,NULL) );setlocale( LC_CTYPE, "chs" );//设定<ctpye.h>中字符处理方式……//中间处理setlocale( LC_CTYPE, old_locale );free( old_locale );//还原区域设定
虽然可以正常读取,但是大文件就很慢了
于是就改用CFile,在查阅了一些资料后CFile读取txt成功了,但是却读出来的是乱码
后来试了很多方法,最后虽然成功了,但是还是很多问题。
先看看我的几个失败方法:
m_strContent是CString变量;m_strFilePath是文件路径
方法1:
- C/C++ code
WCHAR *pwBuffer = NULL; CFile fRead; if (!fRead.Open(m_strFilePath,CFile::modeRead)) { MessageBox(_T("文件打开出错!"),_T("警告"),MB_ICONERROR); return; } DWORD dwLength = (DWORD)fRead.GetLength(); pwBuffer = new WCHAR[dwLength]; fRead.Read(pwBuffer,dwLength); m_strContent = pwBuffer;
结果是乱码
方法二:使用CArchive
- C/C++ code
CFile fRead; m_strContent=_T(""); if (!fRead.Open(m_strFilePath,CFile::modeRead)) { MessageBox(_T("文件打开出错!"),_T("警告"),MB_ICONERROR); return; } DWORD dwLength = (DWORD)fRead.GetLength(); CArchive ar(&fRead,CArchive::load,dwLength); ar>>m_strContent; ar.Close(); fRead.Close();
很神奇的是只读取了一点点,txt里的内容是一串数字,如0.12345 0.3456 1.233 -1.345……这样的数字
它内容是.12345 0.3456 1.233 -1第一个0没了,然后5mb左右的文件就读到了十几个字符。
最后这个方法能正确解决
- C/C++ code
int nChars; CFile fRead; m_strContent=_T(""); if (!fRead.Open(m_strFilePath,CFile::modeRead)) { MessageBox(_T("文件打开出错!"),_T("警告"),MB_ICONERROR); return; } DWORD dwLength = (DWORD)fRead.GetLength(); char *buf=new char[dwLength]; fRead.Read(buf,dwLength); nChars=MultiByteToWideChar(CP_ACP,0,buf,-1,NULL,0); //获取宽字节所需的缓冲区长度。 TCHAR *wbuff=new TCHAR [nChars]; MultiByteToWideChar(CP_ACP,0,buf,-1,wbuff,nChars); m_strContent = wbuff;
问题1:
- C/C++ code
char* old_locale = _strdup( setlocale(LC_CTYPE,NULL) );setlocale( LC_CTYPE, "chs" );//设定<ctpye.h>中字符处理方式……//中间处理setlocale( LC_CTYPE, old_locale );free( old_locale );//还原区域设定
这段代码有什么用呢?
问题2:(这是我比较想知道的)
CArchive为何会只读取到那么一点?
问题3:
WCHAR和char之间的区别是什么?
------解决方案--------------------------------------------------------
1.设置字符集,读取的时候好处理中文
2.可能对于空格等自动截取了
3.一个是UNICODE字符串,一个是ANSI字符串,两者之间需要编码转换
------解决方案--------------------------------------------------------
- C/C++ code
CFile file(L"c:\\test.txt",CFile::modeRead);char *pBuf;int iLen=file.GetLength();pBuf=new char[iLen+1];file.Read(pBuf,iLen);pBuf[iLen]=0;CString str1(pBuf); //CString str1=CA2W(pBuf,CP_UTF8); //Utf8格式文件用此方法delete[] pBuf;file.Close();MessageBox(str1);
- unicode环境下用CFile读取txt的若干疑惑,该如何处理
- VC++ unicode下读取unicode CFile::typeUnicodetxt的数据
- VS2008 用CFile对象读取Unicode文本。
- MFC 在非unicode的工程下,读取unicode编码的txt
- 使用Unicode字符集时用CFile把中文写入txt文件再用记事本打开出现乱码的问题
- 使用Unicode字符集时用CFile把中文写入txt文件再用记事本打开出现乱码的问题
- UNICODE环境下读写txt文件操作
- unicode环境下读取ansi文本文件
- CStdioFile在UNICODE环境下读取汉字
- UNICODE环境下,CIPAddressCtrl地址控件的处理
- VC++unicode项目使用CFile类写txt日志文件
- UNICODE编码下CFile写入文本(TEXT)
- UNICODE环境下整行读取文本文件的方法
- 不要再纠结在Unicode下含有CString的结构体CFile文件的输入输出了
- CFile的Unicode宽字符写文件
- Java处理txt文件遇到的问题 (unicode编码)
- 现在我要写一个定时程序定时读取该目录下的所有txt文件到数据库,并把这些txt文件转移到另外一个目录
- Android 读取raw下的txt文件
- 最新flash player 11.4.402.278在Win7 + Firefox环境下无法检测到摄像头被占用
- VS2008 error C2664的解决 字符编码
- c++ 虚继承与继承的差异
- UITapGestureRecognizer 的用法
- poco库学习笔记(7) Poco::Any
- unicode环境下用CFile读取txt的若干疑惑,该如何处理
- SQL网上一些浏览(5)
- C#打开网址的方法
- YUV420图像格式
- 宏发41F-1Z-C2接线
- 开源中最好的Web开发的资源
- vim高效编辑——vim复制粘贴探密(转)
- grep详解
- 创建消息循环(Creating a Message Loop)