入门客AI创业平台(我带你入门,你带我飞行)
博文笔记

CStdioFile 指定文件类型为UNICODE写文件

创建时间:2014-09-22 投稿人: 浏览次数:792

今天要写一个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。
  • 上一篇:没有了
  • 下一篇:没有了
未上传头像