在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' 。

 

Logo

更多推荐