1. 程式人生 > >va_start、va_end、va_arg、va_list、fprintf、 vfprintf用法解釋

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

今天有個需求寫檔案,所有研究了一下標題的函式:
首先要使用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