我希望有一个帮助函数log
,基本上可以执行以下操作:
log(file, "array has %d elements\n", 10);
// writes "2014-02-03 16:33:00 - array has 10 elements" to &file
我有time部分,我的文件写入部分已关闭。但是,问题是log
的方法签名本身 - 我应该放什么? This说printf
声明以...
关键字结尾,但我如何在我的函数中使用它?
void log(FILE *f, const char * format, ...) // how would I pass ... to fprintf?
让我编辑这包含更多信息。
我有const char * now ()
,返回“2014-02-03 16:33:00”形式的字符串。我想像这样传递另一个格式字符串。这两个陈述应该是等价的:
log(file, "array has %d elements\n", 10);
fprintf(file, "%s - array has %d elements\n", now(), 10);
我知道vfprintf
允许我传递va_list
,但我怎样才能将now()
作为第一个参数,之前所有其他参数?
答案 0 :(得分:8)
您要查找的方法是vfprintf
或可能vprintf
(不清楚哪个问题)
这实际上是printf
的实现,它允许va_list
作为参数显式传入。因此,在您的方法中,您可以为方法参数创建va_list
并将其转发到vfprintf
void log(FILE* f, const char* format, ...) {
va_list args;
va_start (args, format);
vfprintf (f, format, args);
va_end (args);
}
答案 1 :(得分:8)
使用vprintf
,声明为:
int vprintf(const char *format, va_list ap);
在log
函数中,调用va_start
获取va_list
值,然后将该值传递给vprintf
。
由于您的log
函数需要FILE*
个参数,您可能希望使用vfprintf
而不是vprintf
(并且可能会更新您的问题以询问{{} 1}}而不是fprintf
)。
顺便提一下,您可能需要重新考虑使用名称printf
;这是log
中声明的标准函数的名称。
反映您更新的问题,您可以直接致电<math.h>
打印log
内的时间戳:
fprintf