该类主要功能是输出信息到文本,实现方式类似于printf函数。
头文件如下:
#pragma once
#define FILE_NAME_SIZE 256 //文件名称大小
#define MAX_FILE_SIZE (4*1024) //最大的文件大小(4M)
/*功能:log日志类,输入信息到文件
作者:LZH
*/
class CHLog
{
public:
CHLog(void);
~CHLog(void);
private:
wchar_t m_FileName[FILE_NAME_SIZE]; //文件名称
int m_nFileSize; //文件大小(KB)
FILE *m_fpFile; //文件指针
public:
//初始化log,生成默认文件名(时间.LOG)
bool InitLogFile();
//初始化log,设置文件名(文件路径),打开文件
bool InitLogFile(const wchar_t *szFileName);
//停止log,关闭文件
void CloseLog();
//输出数据到文件,目前支持%s、%S(宽字符串)、%c、%d、%f、%02X、%lld
void WriteLogTofile(const char *format, ...);
//加时间戳,输出数据到文件(【时间】 + 信息),目前支持%s、%S(宽字符串)、%c、%d、%f、%02X、%lld
void WriteLogTofile(const bool &bHaveTime, const char *format, ...);
//protected:
//获得系统时间字符串
bool GetSystemTime(wchar_t *timebuff, int bufferlen, const wchar_t &cSplit = L'\0');
public:
};
源文件如下:
#include "stdafx.h"
#include "HLog.h"
#include
CHLog::CHLog(void)
:m_nFileSize(0), m_fpFile(NULL)
{
memset(m_FileName, 0, sizeof(wchar_t)*FILE_NAME_SIZE);
}
CHLog::~CHLog(void)
{
}
//初始化log,生成默认文件名(时间.LOG)
bool CHLog::InitLogFile()
{
//获得时间戳
if ( GetSystemTime(m_FileName, FILE_NAME_SIZE) )
{
//加上.LOG
wcscat_s(m_FileName, L".LOG");
//打开嗯我那件
if (NULL != m_FileName)
{
_wfopen_s(&m_fpFile, m_FileName, L"a+");
}
}
return false;
}
//设置文件名(文件路径)
bool CHLog::InitLogFile(const wchar_t *szFileName)
{
//校验
if ( (NULL == szFileName) ||
(1 > wcslen(szFileName)) ||
(FILE_NAME_SIZE < wcslen(szFileName)) )
{
return false;
}
//赋值
wcscat_s(m_FileName, FILE_NAME_SIZE, szFileName);
//打开嗯我那件
if (NULL != m_FileName)
{
_wfopen_s(&m_fpFile, m_FileName, L"a+");
}
return true;
}
//停止log,关闭文件
void CHLog::CloseLog()
{
fclose(m_fpFile);
}
//获得系统时间字符串【格式:2018 + 分割符 + 0523 + 分隔符 + 150353】
bool CHLog::GetSystemTime(wchar_t *timebuff, int bufferlen, const wchar_t &cSplit)
{
// 校验入参
if ( (NULL == timebuff) )
{
return false;
}
// 获取系统当前时间戳
time_t tt = time(NULL);
struct tm t;
errno_t err = localtime_s(&t, &tt);
//校验
if (0 != err)
return false;
//获得字符串
if (L'\0' == cSplit)
{
swprintf_s( timebuff,
bufferlen,
L"%d%02d%02d%02d%02d%02d",
t.tm_year + 1900,
t.tm_mon + 1,
t.tm_mday,
t.tm_hour,
t.tm_min,
t.tm_sec);
}
else
{
swprintf_s( timebuff,
bufferlen,
L"\n%d%c%02d%02d%c%02d%02d%02d\n",
t.tm_year + 1900,
cSplit,
t.tm_mon + 1,
t.tm_mday,
cSplit,
t.tm_hour,
t.tm_min,
t.tm_sec);
}
return true;
}
//输出数据到文件,目前支持%s、%S(宽字符串)、%c、%d、%f、%02X、%lld
void CHLog::WriteLogTofile(const char *format, ...)
{
//校验
if (NULL == m_fpFile)
return;
//变量定义
va_list ap = NULL;
va_start(ap, format);
char *eos = (char *)format; //结束标志
//开始写入
while (*eos)
{
if('%' == *eos)
{
//获得下一个字符
eos++;
switch(*eos)
{
case 's': //字符串
{
char *sTmp = va_arg(ap, char*);
while(*sTmp)
{
fprintf(m_fpFile, "%c", *sTmp);
sTmp++;
}
break;
}
case 'S': //宽字符串
{
wchar_t *wsTmp = va_arg(ap, wchar_t*);
while(*wsTmp)
{
fprintf(m_fpFile, "%c", *wsTmp);
wsTmp++;
}
break;
}
case 'c': //字符
{
char cTmp = va_arg(ap, char);
fprintf(m_fpFile, "%c", cTmp);
break;
}
case 'd': //十进制
{
int dTmp = va_arg(ap, int);
fprintf(m_fpFile, "%d", dTmp);
break;
}
case '0': //二进制02X
{
char *cNext = eos;
if (('2' == *(++eos)) && ('X' == *(++eos)))
{
int dTmp = va_arg(ap, int);
fprintf(m_fpFile, "%02X", dTmp);
}
break;
}
case 'f': //浮点型
{
float fTmp = (float)va_arg(ap, double);
fprintf(m_fpFile, "%f", fTmp);
break;
}
case 'l': //LONGLONG型
{
char *cNext = eos;
if (('l' == *(++eos)) && ('d' == *(++eos)))
{
LONGLONG lTmp = (LONGLONG)va_arg(ap, LONGLONG);
fprintf(m_fpFile, "%lld", lTmp);
}
break;
}
default :
break;
}
}
else
{
fprintf(m_fpFile, "%c", *eos);
}
eos++;
}
//最后写入换行符
fprintf(m_fpFile, "\n");
}
//加时间戳,输出数据到文件(【时间】 + 信息),目前支持%s、%S(宽字符串)、%c、%d、%f、%02X、%lld
void CHLog::WriteLogTofile(const bool &bHaveTime, const char *format, ...)
{
//校验
if (NULL == m_fpFile)
return;
//写入时间戳
if (bHaveTime)
{
wchar_t szTime[FILE_NAME_SIZE];
GetSystemTime(szTime, FILE_NAME_SIZE);
fprintf(m_fpFile, "【%S】", szTime);
}
//变量定义
va_list ap = NULL;
va_start(ap, format);
char *eos = (char *)format; //结束标志
//开始写入
while (*eos)
{
if('%' == *eos)
{
//获得下一个字符
eos++;
switch(*eos)
{
case 's': //字符串
{
char *sTmp = va_arg(ap, char*);
while(*sTmp)
{
fprintf(m_fpFile, "%c", *sTmp);
sTmp++;
}
break;
}
case 'S': //宽字符串
{
wchar_t *wsTmp = va_arg(ap, wchar_t*);
while(*wsTmp)
{
fprintf(m_fpFile, "%c", *wsTmp);
wsTmp++;
}
break;
}
case 'c': //字符
{
char cTmp = va_arg(ap, char);
fprintf(m_fpFile, "%c", cTmp);
break;
}
case 'd': //十进制
{
int dTmp = va_arg(ap, int);
fprintf(m_fpFile, "%d", dTmp);
break;
}
case '0': //二进制02X
{
char *cNext = eos;
if (('2' == *(++eos)) && ('X' == *(++eos)))
{
int dTmp = va_arg(ap, int);
fprintf(m_fpFile, "%02X", dTmp);
}
break;
}
case 'f': //浮点型
{
float fTmp = (float)va_arg(ap, double);
fprintf(m_fpFile, "%f", fTmp);
break;
}
case 'l': //LONGLONG型
{
char *cNext = eos;
if (('l' == *(++eos)) && ('d' == *(++eos)))
{
LONGLONG lTmp = (LONGLONG)va_arg(ap, LONGLONG);
fprintf(m_fpFile, "%lld", lTmp);
}
break;
}
default :
break;
}
}
else
{
fprintf(m_fpFile, "%c", *eos);
}
eos++;
}
//最后写入换行符
fprintf(m_fpFile, "\n");
}
具体调用方法如下:
CHLog hlog;
hlog.InitLogFile();
wchar_t timebuff[256];
int bufferlen = 256;
hlog.GetSystemTime(timebuff, bufferlen, L'_');
char c[100] = "哈哈哈";
int n = 10;
float f = 1.678;
LONGLONG ld = -8889;
hlog.WriteLogTofile(true, "\n变量1 = %S\n,变量2 = %s,变量3 = %d, 变量4 = %f,变量5 = %lld\n", timebuff, c, n, f, ld);
本人菜鸟一枚,有bug的地方欢迎指正!