2009-10-21 63 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); 
    } 
相关问题