Передать строку формата через процедуру в fprintf - PullRequest
2 голосов
/ 21 октября 2009

Я работаю над программой, которая генерирует файл 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 ]

8 голосов
/ 21 октября 2009

Вам нужно 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 имеет только локальное значение (оно открывается и закрывается в этой функции), поэтому его не следует прошло вокруг.

4 голосов
/ 21 октября 2009

Это то, для чего 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 голосов
/ 21 октября 2009

Вам нужно будет использовать функцию Variadic. См. Пересылка вызова функции с переменным числом в C

1 голос
/ 21 октября 2009
   #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);
   }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...