unicode模式下写日志文件

来源:互联网 发布:mysql distinct 编辑:程序博客网 时间:2024/05/18 00:45

在C/C++/VC/MFC技术交流群【197778914】中看到大牛VOID写的打造简易日志函数的视频,于是想自己写一个UNICODE版本的

在stdafx.h中定义函数

void TraceLog(TCHAR* lpszFormat, ...);

在stdafx.cpp中实现该函数(原来还可以这样,那就可以把一些公用的函数写在这个cpp里面)

void TraceLog(TCHAR* lpszFormat, ...)
{
va_list args;
TCHAR sTemp[512] = _T("");


va_start(args, lpszFormat);
_vsntprintf(sTemp, sizeof(sTemp)/sizeof(TCHAR), lpszFormat, args);
va_end(args);


//日期
SYSTEMTIME sysTime;
::GetLocalTime(&sysTime);


TCHAR sTrace[1024] = _T("");
_stprintf(sTrace, _T("[%02u:%02u:%02u: %02u:%02u:%02u] %s\r\n")
, sysTime.wYear, sysTime.wMonth, sysTime.wDay
, sysTime.wHour, sysTime.wMinute, sysTime.wSecond
, sTemp);


//输出到文件
FILE* pFile = NULL;
DWORD dwAttr = ::GetFileAttributes(_T("C:\\TraceLog.txt")); 
if (dwAttr == 0xffffffff) //文件第一次打开
{
pFile = _tfopen(_T("C:\\TraceLog.txt"), _T("ab"));
#ifdef _UNICODE
unsigned char u[2] = {0xff,0xfe};//写入UNICODE的头
fwrite(u,2,1,pFile);

#endif
}
else
{
pFile = _tfopen(_T("C:\\TraceLog.txt"), _T("ab"));
}


fwrite(sTrace, 1, _tcslen(sTrace)*sizeof(TCHAR), pFile);
fclose(pFile);
pFile = NULL;
}

写了一个button按钮,测试日志的功能

void CTraceLogDemoDlg::OnBnClickedButton1()
{
int i = 3;
float f = 3.14f;
//::TraceLog("i=%d, f=%f", ++i, f);
::TraceLog(_T("HELLO WORLD. %s, i+9=%d, i-10=%d"), _T("你好呀"), i+9, i-10);
//HELLO WORLD. 你好呀, i+9=12, i-10=-7
}

工程设置为unicode字符集和多字节字符集时,均可正确显示。

unicode的文件写入时,应该先写入UNICODE的头,0xFF0xFE

另外,最初写入的时候发现换行符显示不正常,后来网上查阅资料发现unicode的文件打开的时候,最好用二进制的方式b


0 0
原创粉丝点击