web-dev-qa-db-ja.com

可変引数をprintfに渡します

基本的に次のことを行うヘルパー関数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?
_

これを[〜#〜]編集[〜#〜]して、もう少し情報を含めましょう。

「2014-02-0316:33:00」という形式の文字列を返すconst char * now ()があります。このように別のフォーマット文字列を渡したいのですが。 2つのステートメントは同等である必要があります。

_log(file, "array has %d elements\n", 10);
fprintf(file, "%s - array has %d elements\n", now(), 10);
_

vfprintfで_va_list_を渡すことができることは知っていますが、now()を最初の引数before他のすべて?

14
wchargin

次のように宣言されているvprintfを使用します。

int vprintf(const char *format, va_list ap);

log関数で、va_startを呼び出してva_list値を取得し、その値をvprintfに渡します。

log関数はFILE*引数を取るので、おそらくvfprintfではなくvprintfを使用することをお勧めします(そして、おそらくfprintfではなくprintfについて質問するように質問を更新してください)。

ちなみに、logという名前の使用を再検討することをお勧めします。これは、<math.h>で宣言されている標準関数の名前です。

更新された質問を反映して、logを直接呼び出すことにより、fprintf内にタイムスタンプを出力できます。

va_list(args);
fprintf(f, "%s - ", now());
va_start(args, format);
vfprintf(f, format, args);
12
Keith Thompson

あなたが探している方法は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);
}
10
JaredPar