在Linux环境下调试程序,很多时候需要打印日志文件。如何可以方便快捷的打印出自己想要的日志文件的格式,有没有一个统一的方法,不需要定义多个呢?
今天探索了一下这个问题的答案,还真有。
以前打印日志文件的时候,定义过的方法如下:
void log4c_str(char *filepath, char *msg, char *str)
{
char tmpstr[128];
sprintf(tmpstr, msg, str);
FILE *fp;
fp = fopen(filepath,"a");
if(fp >= 0) {
fprintf(fp, "%s\n", tmpstr);
fclose(fp);
}
}
还有这样的:
void log4c_int(char *filepath, char *msg, int intvalue)
{
char tmpstr[128];
sprintf(tmpstr, msg, intvalue);
FILE *fp;
fp = fopen(filepath,"a");
if(fp >= 0) {
fprintf(fp, "%s\n", tmpstr);
fclose(fp);
}
}
如此,仅是针对要不同的类型,定义不同的方法,更气的是,我想要打印多个参数,压根就实现不了。
经过探索后,发现stdio.h标准库中,除了printf函数以外,还给出了好几个函数,如图:
对比后,突然好兴奋,有一个fprintf()函数可以将可变参数写入到文件中,于是立马去查看了例程,如下:
从例程中可以看出,虽然可以将可变参数写入到文件,但是没有办法封装一个统一的方法。
继续查看其他的方法,
int vfprintf(FILE *stream, const char *format, va_list arg)
使用参数列表发送格式化输出到流 stream 中。
就是它了,立马封装方法试验一个,结果不出所料,真的好使。但是需要包含 stdarg.h 标准头文件。
封装的方法,和测试代码如下:
#include <stdio.h>
#include <stdarg.h>
int log4c(char *filepath, char *fmt, ...)
{
FILE * fp;
va_list ap;
va_start(ap, fmt);
fp = fopen (filepath, "a+");
int res = vfprintf(fp, fmt, ap);
fclose(fp);
va_end(ap);
return res;
}
int main()
{
int res = log4c("test.txt", "this is %s, age is %d, he is a good %s, hight is %.2f\n", "Johnny", 29, "man", 168.5);
printf("res = %d\n", res);
}
多运行几次后,结果如下:
以上,再调试Linux C程序再也不用愁打印不同格式日志文件了。
再来一个彩蛋,更厉害的是,浮点数要控制精度的话,也不在话下。%.2控制了保留小数点后两位。
还有一点,自定义方法 int log4c(char *filepath, char *fmt, ...)的返回值,是字符串的长度+1 。为什么是 字符串长度+1呢?
我认为 加的那一字节恰好存 '\0' 。