1、原理
原理不是很难网上有很多,自己搜一下就明白了。
2、代码
void PrintLog (const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
vfprintf(stdout,fmt,ap);
va_end(ap);
}
3、解释
看到上面代码太简单了,也许有人会说,这有什么用?
在我看来最大的用处在于写日志,如果我们把代码稍稍改下就可以把屏幕上的输出一起输出到文件一份:
在初始化处把全局变量日志文件打开就像这样:
pLogFile = fopen("logFile.txt", "w");
if (NULL == pLogFile)
{
PRINTLOG("can not write log file logFile.txt!\n");
}
然后稍稍修改下自己的print:
void PrintLog (const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
vfprintf(stdout,fmt,ap);//输出到屏幕
if (NULL != pLogFile)
{
vfprintf(pLogFile,fmt,ap);//输出一份到文件
}
va_end(ap);
}
最后在反初始化的时候关掉文件句柄:
if (NULL != pLogFile)
{
fclose(pLogFile);
}
一个简单的打印日志就ok了。
稍微变动一下初始化的地方,把每天的日志写进一个文件:
time_t rawtime;
struct tm * timeinfo;
char logFileName[100];
time ( &rawtime );
timeinfo = localtime ( &rawtime );
printf ( "\007The current date/time is: %s", asctime (timeinfo) );
sprintf(logFileName, "log_%d_%d", timeinfo->tm_mon + 1, timeinfo->tm_mday);
pLogFile = fopen(logFileName, "a+");
PRINTLOG("------------log-%s-begin---------------\n", asctime (timeinfo));
if (NULL == pLogFile)
{
PRINTLOG("can not write log file logFile.txt!\n");
}
然后在反初始化的时候:
PRINTLOG("---------------------------------------------\n\n\n");
if (NULL != pLogFile)
{
fclose(pLogFile);
}
这样同一天的日志降打印到同一个文件中去,并且每次的日志会有时间隔开。