C语言之变参日志函数

 

#include <stdio.h>
//是Linux 系统的日期时间头文件。通常会包含include time.h
#include <sys/time.h>
// 是ISO C99 标准日期时间头文件。编写的代码平台无关的需要引入
#include <time.h>

//让函式能够接收不定量参数,va_list需要
#include <stdarg.h>

#define DEBUG 1
#define LOGFILE "write.log"

//编写的代码平台无关的
#define __need_time_t
#define __need_timespec

#define LOG_ERROR 0
#define LOG_NOTICE 1
#define LOG_DEBUG 2
//fmt为格式化字串,如%d%s%c%f
static void WriteLog(int level, const char *fmt, ...)
{
    va_list ap;
    FILE *fp;

#ifdef DEBUG
    fp = stdout;
#else
    fp = fopen(LOGFILE, "a+");
    if (!fp) return;
#endif

    va_start(ap, fmt);
    char *c = "-*+";
    char buf[64];
    time_t now;

    //1970年1月1日00:00:00(称为UNIX系统的Epoch时间)到当前时刻的秒数
    now = time(NULL);
    //gmtime 把日期和时间转换为格林威治(GMT)时间的函数,结果由结构tm返回
    //strftime将tm结构体时间格式化,%d 十进制表示的每月的第几天%b 月分的简写
    strftime(buf, 64, "[%d %b %H:%M:%S]", gmtime(&now));
    //格式化输出到一个流/文件中
    fprintf(fp, "%s %c ", buf, c[level]);
    //格式化输出到一个流/文件中
    int cnt = vfprintf(fp, fmt, ap);
    fprintf(fp, " write %d bite",cnt);
    fprintf(fp, "\n");
    //清除文件缓冲区,文件以写方式打开时将缓冲区内容写入文件
    //fflush(stdout)刷新标准输出缓冲区,把输出缓冲区里的东西打印到标准输出设备上
    fflush(fp);
    va_end(ap);
#ifndef DEBUG
    fclose(fp);
#endif

}
int main(int argc, char *argv[])
{
    WriteLog(LOG_ERROR, "%s %s ","this is a test", "hello world");
    WriteLog(LOG_NOTICE, "%s %s ", "this is a test2", "hello world");
    WriteLog(LOG_DEBUG, "%s %s ", "this is a test3", "hello world");
}

 

此函数主要是学习va_list和vfprintf和使用,需要注意的是vfprintf传的第二个参数fmt是格式化字符串,而不是其它,刚开始漏传导致第二个参数不能打印。

Tags: c语言

上一篇: ImageMagick实现GIF动画缩略图   下一篇: C语言之分析命令行参数

提交疑问

回顶部