wofstream输出Unicode字串出错!请帮看一下,该怎么解决
wofstream输出Unicode字串出错!请帮看一下
写一个MFC程序用到了C++的标准输出流
(MFC的CFile类感觉输出字符文件不太舒服,估计是我不太会用,那位大虾要有好的建议请提点一下哈)
下面是FileTrans函数定义
虽然用out.clear()也能让程序正确运行,但是想搞清楚为什么宽字符输出流输出Unicode就会出错?
另如果对读写Unicode比较有心得的也请分享一下,谢谢!
------解决方案--------------------
char* pBuf=new char[(UINT)len];
用unicode这个是不是要定义成TCHAR
------解决方案--------------------
写一个MFC程序用到了C++的标准输出流
(MFC的CFile类感觉输出字符文件不太舒服,估计是我不太会用,那位大虾要有好的建议请提点一下哈)
- C/C++ code
wofstream out(strOut); out.imbue(std::locale("chs"));//这句是搜论坛时加上的,但貌似没任何效果 .......... out<<_T("<HTML>")<<endl; out<<_T("\t<HEAD>")<<endl; FileTrans(m_memhead,out);//从CMemFile里向out中转存文件,第一次调用可以正确输出 //如果不加入以下语句,第二次转存将失败: if(out.bad())out.clear(); FileTrans(m_mempage,out); ...............
下面是FileTrans函数定义
- C/C++ code
void CEngine::FileTrans(CFile& fsrc, std::wofstream& out) { ULONGLONG len=fsrc.GetLength(); char* pBuf=new char[(UINT)len]; fsrc.Read((PVOID)pBuf,(UINT)len); out<<(TCHAR*)pBuf<<endl; //这个地方很诡异,如果不强制转换就会只读第一个字节。。。 delete[] pBuf; }
虽然用out.clear()也能让程序正确运行,但是想搞清楚为什么宽字符输出流输出Unicode就会出错?
另如果对读写Unicode比较有心得的也请分享一下,谢谢!
------解决方案--------------------
char* pBuf=new char[(UINT)len];
用unicode这个是不是要定义成TCHAR
------解决方案--------------------
- C/C++ code
void CEngine::FileTrans(CFile& fsrc, std::wofstream& out) { ULONGLONG len=fsrc.GetLength(); char* pBuf=new char[(UINT)len]; fsrc.Read((PVOID)pBuf,(UINT)len); out<<(TCHAR*)pBuf<<endl; //这个地方很诡异,如果不强制转换就会只读第一个字节。。。 delete[] pBuf; TCHAR lpszFile[256]; MultiByteToWideChar(CP_ACP, 0, pFilePathName, nLen, lpszFile, nwLen); }
------解决方案--------------------
据我所知,宽字符流不支持unicode编码的文件。因此内存中的宽字符写到文件中就变成了ANSI字符。若想使用unicode编码的文件,可以用boost。
------解决方案--------------------
汗,难道是我写得不清楚,你是Read的时候,没有加结束符,加上应该就好了
如下:
void CEngine::FileTrans(CFile& fsrc, std::wofstream& out)
{
ULONGLONG len=fsrc.GetLength();
char* pBuf=new char[(UINT)(len + 2)];
int rdLen = fsrc.Read((PVOID)pBuf,(UINT)len);
pBuf[rdLen] = "\0";
pBuf[rdLen + 1] = "\0"
out < <(TCHAR*)pBuf < <endl; //这个地方很诡异,如果不强制转换就会只读第一个字节。。。
delete[] pBuf;
}