欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

va_start、va_end、va_arg、va_list、fprintf、 vfprintf用法解释

程序员文章站 2024-03-15 22:04:18
...

今天有个需求写文件,所有研究了一下标题的函数:
首先要使用va_start等这些方法需要包含头文件:

#include<stdarg.h>

直接上代码说明:

int MyWriteFile(char *format, ...)
{
	va_list paramList;
	char *para;
	//va_start函数来获取参数列表中的参数, 使paramList指向第一个可选参数
	va_start(paramList, format);

	FILE* pFile = fopen("123.txt", "a");
	while (1)   
	{   
		//va_arg返回参数列表中的当前参数并使paramList指向参数列表中的下一个参数, 而para则是获取的参数
		para = va_arg(paramList, char *);
		//这里做判断,是因为我在传参数的时候给了"",做完退出循环的条件
		if (strcmp( para, "") == 0)   
			break;  
		//以"MAX:%d  MIN:%d  str:%s " 的格式写入文件
		fprintf(pFile, "MAX:%d  MIN:%d  str:%s \n", INT_MAX, INT_MIN, para);
	}
	//其实就把format的第一个内容写到文件中
	//vfprintf(pFile, format, paramList);

	//va_end把paramList指针清为NULL
	va_end(paramList);
	return 0;
}

主函数:

int main()
{
	MyWriteFile("DEMO", "This", "is", "a", "demo!", "");
	return 0;
}

结果:

MAX:2147483647  MIN:-2147483648  str:This 
MAX:2147483647  MIN:-2147483648  str:is 
MAX:2147483647  MIN:-2147483648  str:a 
MAX:2147483647  MIN:-2147483648  str:demo! 

如果vfprintf这句打开注释,结果为:

MAX:2147483647  MIN:-2147483648  str:This 
MAX:2147483647  MIN:-2147483648  str:is 
MAX:2147483647  MIN:-2147483648  str:a 
MAX:2147483647  MIN:-2147483648  str:demo! 
DEMO

下面代码主要是va_start 、va_list,va_end, vfprintf
主要是vfprintf()会根据参数format字符串来转换并格式化数据,然后将结果输出到参数stream指定的文件中,直到出现字符串结束(‘\0’)为止

FILE *fp = fopen("123.txt", "a");;
int VfpDemo(char *fmt, ...)
{
	va_list argptr;
	int cnt;
	va_start(argptr, fmt);
	cnt = vfprintf(fp, fmt, argptr);
	va_end(argptr);
	return(cnt);
}
int main(void)
{
	int inumber = 30;
	float fnumber = 90.0;
	char string[4] = "abc";
	if (fp == NULL)
	{
		exit(1);
	}
	VfpDemo("%d %f %s", inumber, fnumber, string);
	fclose(fp);
	return 0;
}

运行结果:

30 90.000000 abc