您的位置:首页 > 编程语言 > C语言/C++

c++实现 日志记录

2014-06-25 15:33 183 查看
// logtest.cpp : 定义控制台应用程序的入口点。
///************************************************************************/
/* 
author:郑金玮
time:2014/07/03
desc:implement log instance in svc pro
*/
/************************************************************************/
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>

#define DISALLOW_COPY_ASSIGN(typename) \
private: \
typename(const typename&); \
typename operator = (const typename&);

class CLog
{
DISALLOW_COPY_ASSIGN(CLog);
public:
CLog();
~CLog();
static CLog* getinstance();
bool open(const char szFile[]);
void log(const char* fmt,...);

private:
FILE* m_pfile;
};

#define LOGINSTANCE()   CLog::getinstance()

CLog::CLog()
{

}
CLog::~CLog()
{

if (fclose(m_pfile) !=0)
{
return;
}
}
CLog* CLog::getinstance()
{
static CLog _logInst;
return &_logInst;
}
bool CLog::open(const char szFile[])
{
if ((m_pfile = fopen(szFile,"a"))== NULL)
{
return false;
}

return true;
}

void CLog::log(const char* fmt,...)
{
va_list ap;
va_start(ap, fmt);//将ap指向fmt后的第一个参数

char _strtemp[1024];
memset(_strtemp,0,1024);

while(*fmt)
{
if(*fmt == '%')
{
switch(*(++fmt))
{
case 'd':{
char _str[256];
sprintf(_str,"%d",va_arg(ap, int));
strcat(_strtemp,_str);
}break;
case 'f':{
char _str[256];
double _dval=va_arg(ap, double);
_gcvt(_dval,8,_str);
strcat(_strtemp,_str);
}break;
case 's':{
strcat(_strtemp,va_arg(ap, char*));
}break;
default:break;
}
}
else
{
char _str[256];
sprintf(_str,"%c",*fmt);
strcat(_strtemp,_str);
}
fmt ++;
}

printf("\n");
printf(_strtemp);
printf("\n");

fputs("\n",m_pfile);
fputs(_strtemp,m_pfile);
fputs("\n",m_pfile);
va_end(ap);
}

#define PRINTLOG   LOGINSTANCE()->log

int _tmain(int argc, _TCHAR* argv[])
{

LOGINSTANCE()->open("..//test.log");
//LOGINSTANCE()->log("%s-welcome to beijing---%d------%f","zhengjinwei ",23,23.11);
PRINTLOG("%s: welcome to beijing---%d------%f","zhengjinwei ",23,23.11);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: