C++如何将Unicode文本写到日志文件中
2023-09-14 09:10:49 时间
有时为了定位问题,我们需要结合打印日志来处理。特别是较难复现的,一般都需要查看上下文日志才能找出可能存在的问题。考虑到程序要在不同语言的操作系统上运行,程序界面显示要支持Unicode,打印出来的日志也要支持Unicode,即将运行日志以Unicode文本写到日志文件中。
那么如何才能将Unicode文本写到日志文件中呢?只要我们调用Unicode版本的写入函数,传入Unicode字符串就能实现写入了吗?试一试便知道,仅仅这样肯定实现不了的。经实际调试和使用,只要满足下面几点即可:
1、文件以二进制方式打开;
2、写入Unicode文本标识头:0xFFFE;
3、调用Unicode版本的写入函数,传入Unicode字符串;
4、如果打印日志中要换行,仅仅\n是不行的,要用\r\n。
下面分别给出两个版本的参考源码:
1、C函数写日志示例代码:
void WriteLog( LPCTSTR pszLog, LPCTSTR pszFilePath )
{
if ( pszLog == NULL || pszFilePath == NULL )
{
return;
}
BOOL bFileExsit = PathFileExists( pszFilePath );
LPCTSTR pszMode = NULL;
#ifdef _UNICODE
pszMode = _T("ab+"); // 对于Unicode,要向文件中写入Unicode文字,必须以二进制方式打开
#else
pszMode = _T("a+");
#endif
FILE* pFile;
pFile = _tfopen( pszFilePath , pszMode );
if( NULL == pFile )
{
return;
}
if ( !bFileExsit )
{
// 新创建的日志文件,则写入Unicode头
BYTE chUnicodeHead[2] = { 0xff, 0xfe }; // Unicode头
fwrite( chUnicodeHead, sizeof(BYTE), sizeof(chUnicodeHead), pFile );
}
SYSTEMTIME time;
::GetLocalTime( &time );
_ftprintf( pFile, _T("%04d-%02d-%02d %02d:%02d:%02d %s\r\n"), time.wYear, time.wMonth, time.wDay, time.wHour, time.wMinute, time.wSecond, pszLog );
fclose( pFile );
return;
}
2、MFC中的CStdioFile示例:
void WriteLog( LPCTSTR pszLog, LPCTSTR pszFilePath )
{
if ( pszLog == NULL || pszFilePath == NULL )
{
return;
}
CStdioFile logFile;
CFileException ex;
BOOL bFileExsit = PathFileExists( pszFilePath );
UINT uOpenFlag = CFile::shareDenyNone | CFile::modeCreate | CFile::modeWrite | CFile::modeNoTruncate;
#ifdef _UNICODE
uOpenFlag |= CFile::typeBinary; // 对于Unicode版本,要写入Unicode文字,所以要设置CFile::typeBinary标记
#endif
BOOL32 bRet = logFile.Open( pszFilePath, uOpenFlag, &ex );
if ( bRet )
{
#ifdef _UNICODE
// 对于新建的文件,为了向文件中写入Unicode文字,要写写入Unicode头
if ( !bFileExsit )
{
flog.SeekToEnd();
WORD unicodeFlag = 0xFEFF; // 文件采用unicode格式
flog.Write( (void*)&unicodeFlag, sizeof(WORD) );
}
#endif
flog.SeekToEnd();
flog.WriteString( achPrintBuf );
flog.Close();
}
}
相关文章
- visual C++游戏绘图之透明效果制作原理
- Win10系列:VC++ XML文件解析
- c++ 一个h文件里面定义一个主类,然后定义多个子类
- C语言/C++常见习题问答集锦(二十八)
- C++与C#有关对库(动态库dll,静态库.lib)文件的调用
- c++文件操作3之二进制写文件
- 给正准备学习VC++朋友的建议
- 杨辉三角(C++)
- c++读写txt与dat文件
- C++通过CFile写本地日志文件
- c++ 模板参数有默认值时模板特例化匹配问题
- c++ 读取txt文件保存到vect
- C++文件类(文件流类)及用法详解
- C++虚继承和虚基类详解(一)
- VC++对字符串进行加密的MD5String和获取文件MD5值的MD5File函数的封装(附源码)
- VC++使用fprintf函数实现写日志文件的功能(附源码)
- 【C++ 科学计算】redis-plus-plus:安装用C ++编写的Redis客户端
- C++ 关键字汇总(避免作为变量名使用)
- C++ 继承与多态详解2