2009-10-21 65 views
1

我正在處理一個生成用於填充Adobe PDF表單的FDF文件的程序。目前,我有各種各樣的過程被調用,就像在每個過程終止之前一樣,它打開FDF文件,寫入特定數據並關閉文件。通過過程將格式字符串傳遞給fprintf

我試圖把代碼寫入FDF文件的數據在一個單獨的過程,然後讓其他程序調用它。這將允許通過任務更好地分離代碼,如果將來我必須改變它,我可以輕鬆地做到這一點。

雖然我有一些問題,因爲我需要將不同數量的變量傳遞給fprintf。也就是說,我曾經有這樣一行:

fprintf(fp,"<</T(f1_44(0))/V(%d)>>\n",wages); 

我寫了下面的功能,但我不能得到它的工作:

void writeToFDF(FILE *fp, char *filename, char *data, char *arg) 
{ 
/* independent method for writing to FDF file */ 

/* open file */ 
fp=fopen(filename,"a"); 

fprintf(fp,data,arg); 

/* close file */ 
fclose(fp); 
} 

所以理論上,我會再父函數調用:

writeToFDF(fp,"1040.fdf","<</T(f1_44(0))/V(%d)>>\n",wages); 

我現在收到錯誤,我相信它與函數的參數的最後部分有關。另外,如果我有多個參數,我怎麼才能使它工作?

謝謝。

回答

8

您需要vfprintf。它會接受一個變量列表的參數。

像這樣:

void writeToFDF(FILE *fp, char *filename, char *data, ...) 
{ 
va_list pl; 

/* independent method for writing to FDF file */ 

/* open file */ 
fp=fopen(filename,"a"); 

va_start (pl, data); 

vfprintf(fp,data,pl); 

/* close file */ 
fclose(fp); 
va_end(pl); 
} 

編輯:當我試圖保持儘可能接近原來的代碼省略了FILE * fp的說法,其實是更好的,ephemient的解決方案:FP只具有本地意義(它打開並在這個函數中關閉),所以它不應該傳遞。

+0

是的,我想過,我得收拾我的代碼。不過,我認爲你使用va_start是正確的,至少在我的Linux機器上,它並不承認va_begin。 –

+0

但是再次感謝! –

+1

糟糕,'va_begin'屬於舊的'varargs.h'。新標準確實是'stdarg.h'和'va_start'。 – ephemient

4

這是vfprintf的用途。

#include <stdarg.h> 
#include <stdio.h> 

void writeToFDF(const char *filename, const char *format, ...) { 
    va_list ap; 
    FILE *fp = fopen(filename, "a"); 
    va_begin(ap, format); 
    vfprintf(fp, format, ap); 
    va_end(ap); 
    fclose(fp); 
} 
+0

謝謝大家!我已經看到有關使用可變參數函數的一些信息,但我沒有看到vfprintf。謝謝! –

+0

在大多數系統參數的宏被稱爲「的va_start」 – eyalm

+0

是的,正如我FVU的解答發表了評論,我搞砸了:準標準使用''varargs.h' va_begin',標準化'stdarg.h'使用'va_start'。 – ephemient

1
#include <stdio.h> 
    #include <stdarg.h> 

    void foo(FILE *file, char *fmt, ...) 
    { 
     va_list ap; 

     va_start(ap, fmt); 
     vfprintf(file, fmt, ap); 
     va_end(ap); 
    } 
相關問題