转自第三度:http://www.disandu.com/?p=875
// 今天写了一段输出文本到文件的代码,一开始用CFile输出中文,总是出现乱码,又是百度(Google被墙了)一番,网上的教程基本是只知其一不知其二,大多只讲了输出文件字节序标记和计算宽字符长度这两个注意点,却没有提到字符转换这个最关键的一步。下面的代码分别输出UTF-8和ANSI(简体中文Windows上是GBK编码)两种编码的文本文件。
//
// 写UTF-8文本
// 下列文件类操作中可能抛出一个CFileException异常
try{
CStdioFile hfile( strFilePath, CFile::modeReadWrite);
if(hfile.m_hFile)
{
DWORD dwFileLen = hfile.GetLength();
if(0== dwFileLen) // 文件为空时写入UTF字节序标记
{
constunsignedcharLeadBytes[]= {0xEF, 0xBB, 0xBF};
hfile.Write(LeadBytes, sizeof(LeadBytes));
}
intnSrcLen = (int)wcslen(lpstrWord);
CStringA utf8String(lpstrWord);
intnBufLen = (nSrcLen+1) * 6;
LPSTR buffer = utf8String.GetBufferSetLength(nBufLen);
// 将UNICODE 转换成UTF8
// 需要函数AtlUnicodeToUTF8 头文件: <atlenc.h>
intnLen = AtlUnicodeToUTF8(lpstrWord, nSrcLen, buffer, nBufLen); // int nLen = utf8String.GetLength();
buffer[nLen] = 0;
utf8String.ReleaseBuffer();
//写文件
hfile.SeekToEnd();
hfile.Write((LPCSTR)utf8String, nLen);
hfile.Write("/r/n", 2);
hfile.Close();
}
}
catch(CFileException* pException)
{
CString strMsg;
TCHARszErrorMessage[512];
if(pException->GetErrorMessage(szErrorMessage,
sizeof(szErrorMessage)/sizeof(*szErrorMessage), 0))
strMsg.Format(_T("(%s:%d)/n%s"), _T(__FILE__), __LINE__, szErrorMessage);
else
strMsg.Format(_T("(%s:%d)"),_T(__FILE__), __LINE__);
AfxMessageBox(strMsg);
}
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// 写ANSI文本:
try{
CStdioFile hfile( strHeiMaiUsrLibPath, CFile::modeReadWrite);
if(hfile.m_hFile)
{
// 将Unicode字符串赋给Ansi格式的CStringA,实现Unicode=>Ansi转换
CStringA utf8String(lpstrWord);
intnLen = utf8String.GetLength();
// 写文件
hfile.SeekToEnd();
hfile.Write((LPCSTR)utf8String, nLen);
hfile.Write("/r/n", 2);
hfile.Close();
}
}
catch(CFileException* pException)
{
CString strMsg;
TCHARszErrorMessage[512];
if(pException->GetErrorMessage(szErrorMessage, sizeof(szErrorMessage)/sizeof(*szErrorMessage), 0))
strMsg.Format(_T("(%s:%d)/n%s"), _T(__FILE__), __LINE__, szErrorMessage);
else
strMsg.Format(_T("(%s:%d)"),_T(__FILE__), __LINE__);
AfxMessageBox(strMsg);
}
分享到:
相关推荐
MFC-CFile文件操作 相关操作
读取ANSI 明码文件 读取Unicode 明码文件 读取Unicode big endian 明码文件 读取UTF-8 明码文件 读取UTF8 Bom 明码文件 读取UTF16-LE 明码文件 读取UTF16-BE 明码文件 到多字节字符串 扩展类CFilePlainCode
主要用于读写uniclde型式的配置文件,注意:配置文件的最后要有一个空行,否则读写不成功。
VS2010/MFC编程入门之四十八(字体和文本输出:文本输出) 第九部分:图形图像 VS2010/MFC编程入门之四十九(图形图像:CDC类及其屏幕绘图函数) VS2010/MFC编程入门之五十(图形图像:GDI对象之画笔CPen) VS...
在Windows中有各种GUI对象(不要和C++对象混淆),当你在进行绘图就需要利用这些对象。而各种对象都拥有各种属性,下面分别讲述各种GUI对象和拥有的属性。 字体对象CFont用于输出文字时选用不同风格和大小的字体。可...
MFC下的文件类_CFile[参照].pdf
用CFile类读取保存下拉菜单,
CFile类是MFC中的文件基类,它直接提供非缓冲的磁盘输入输出。
程序功能将添加到列表控件的数据保存在Debug文件夹LIST.CFG文件中,重新运行程序将LIST.CFG文件中的数据在列表控件显示。
这是关于MFC下CFile操作的类的相关知识。有打开、读写、关闭、遍历、查询等。很好,很有帮助
CFile下的Open---利用CFile打开TIFF文件并将其读入内存,然后利用CFile重新写成TIFF文件 Save -----没用 设置像素---------前四项:选择要剪切的图像的两个点的坐标,后两项:剪切后的图像要放大到多宽
第8章 MFC的进程和线程 148 8.1 Win32的进程和线程概念 148 8.2 Win32的进程处理简介 148 8.2.1 进程的创建 148 8.2.2 进程的终止 149 8.3 Win32的线程 150 8.3.1 线程的创建 150 8.3.2 线程的终止 150 8.3.3 线程...
文本文件分割工具 使用了Combo Box、Edit Box等控件 文本分割工作主要通过CFile和CString来完成
用CFile类简单读写文件
MFC 对话框上 读文件 直接显示出来,可以做参考
我们应该注意到,没有一个受过伦理教育的软件工程师会同意开发出“摧毁巴格达”的程序。然而基本的职业道德却可以要求他们开发出“摧毁城市”的程序,巴格达只是这个程序的一个参数。
解读VC++编程中的文件操作API和CFile类,VC项目开发
const char *与char * const的区别。C语言对文件读写的支持,FILE指针;文本文件和二进制文件的...MFC对文件读写的支持,CFile类和CFileDialog的使用,文件过滤器的设置。win.ini文件和注册表的读写方式及相关知识点。
mfc自定义cfiledialog 预览图片文件
MFC按行读文件