va_start、va_end、va_arg、va_list、fprintf、 vfprintf用法解釋
阿新 • • 發佈:2018-11-11
今天有個需求寫檔案,所有研究了一下標題的函式:
首先要使用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