我正在开发一个生成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);
我现在遇到错误,我认为它与函数参数的最后部分有关。另外,如果我有多个参数,我怎么能让它工作?
谢谢。
答案 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);
}