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
	
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值