CStdioFile 指定文件类型为UNICODE写文件
今天要写一个csv文件,文件格式要求必须是unicode格式。然后我就用CStdioFile来写,但是发现写完了之后老是出现乱码的现象。后来终于解决了。
要点:
文件格式是需要写入一些东西来控制的,比如unicode需写入0xfffe标识
文件内容写入不能直接使用CStdioFile的WritString函数,需用write函数按二进制写入unicode字符
重要代码
CFileDialog dlg(FALSE, _T("csv"), _T("csv.csv"), OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT , _T("csv文件(*.csv)|*.csv||")); if (dlg.DoModal() != IDOK) { return; } CString strPath = dlg.GetPathName(); strPath = strPath.Left(strPath.ReverseFind(".")) + TEXT(".csv");//确保最后生成csv格式文件 CStdioFile clsFile; if(!clsFile.Open(strPath,CFile::modeCreate|CFile::modeWrite|CFile::typeBinary)) { AfxMessageBox(_T("文件创建失败!")); return; } // CStdioFile写入UNICODE字符时,必须指定文件类型为UNICODE,或者在文件头写入0XFFFE。 // 写入 0xfffe BYTE UH[] = {0xff, 0xfe}; clsFile.Write(UH, 2);
void WriteString( CStdioFile &clsFile, const TCHAR *str ) { if(!str) return ; #ifdef UNICODE CString strTemp = str; clsFile.Write(strTemp.GetBuffer(), strTemp.GetLength()*2); #else wchar_t *wideChar = NULL; int needChar = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0); if (needChar > 0) { needChar += 1; wideChar = new wchar_t[needChar]; ZeroMemory(wideChar, needChar*sizeof(wchar_t)); MultiByteToWideChar(CP_ACP, 0, str, -1, wideChar, needChar); clsFile.Write(wideChar, needChar*sizeof(wchar_t)); delete[] wideChar; } #endif }
声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。
- 上一篇:没有了
- 下一篇:没有了