将格式字符串通过过程传递给fprintf

时间:2009-10-21 17:22:52

标签: c

我正在开发一个生成FDF文件的程序,用于填写Adobe PDF表单。目前,我有各种被调用的过程,因为在每个过程终止之前,它会打开FDF文件,写入其特定数据并关闭文件。

我正在尝试将用于将数据写入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);

我现在遇到错误,我认为它与函数参数的最后部分有关。另外,如果我有多个参数,我怎么能让它工作?

谢谢。

4 个答案:

答案 0 :(得分: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);
}
编辑:虽然我试图保持与原始代码的接近,但ephemient的省略FILE * fp参数的解决方案实际上更好:fp只具有本地意义(它在此函数中打开和关闭)所以它不应该是传了过来。

答案 1 :(得分: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);
}

答案 2 :(得分:2)

您需要使用Variadic功能。见Forward an invocation of a variadic function in C

答案 3 :(得分: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);
   }