std::vprintf、std::vfprintf、std::vsprintf、std::vsnprintf
| ヘッダ <cstdio>で定義 |
||
| int vprintf( const char* format, std::va_list vlist ); |
(1) | |
| int vfprintf( std::FILE* stream, const char* format, std::va_list vlist ); |
(2) | |
| int vsprintf( char* buffer, const char* format, std::va_list vlist ); |
(3) | |
| int vsnprintf( char* buffer, std::size_t buf_size, const char* format, std::va_list vlist ); |
(4) | (C++11以降) |
vlist によって定義された場所からデータをロードし、それらを文字列表現に変換して、さまざまな出力先に結果を書き込みます。
目次 |
[編集] パラメータ
| stream | - | 書き込む出力ファイルストリーム |
| buffer | - | 書き込み先の文字列へのポインタ |
| buf_size | - | 書き込む最大文字数 |
| format | - | データの解釈方法を指定する、ヌル終端された文字列へのポインタ |
| vlist | - | 印刷するデータを含む可変長引数リスト |
format 文字列は、出力ストリームにそのままコピーされる通常のバイト文字 (% を除く) と、変換指定子で構成されます。各変換指定子は以下の形式を持ちます。
- 先頭の
%文字。
- 先頭の
- (オプション) 変換の動作を変更する1つ以上のフラグ
-
-: 変換の結果はフィールド内で左寄せされます (デフォルトは右寄せ)。 -
+: 符号付き変換の結果には常に符号が前置されます (デフォルトでは負の場合にのみマイナスが前置されます)。 - space: 符号付き変換の結果が符号文字で始まらない場合、または空の場合、スペースが結果の前に付加されます。
+フラグが存在する場合は無視されます。 -
#: 変換の代替形式が実行されます。正確な効果については以下の表を参照してください。それ以外の場合、動作は未定義です。 -
0: 整数および浮動小数点数の変換の場合、フィールドのパディングにはスペース文字ではなく先行ゼロが使用されます。整数数の場合、精度が明示的に指定されている場合は無視されます。このフラグを使用する他の変換では、未定義の動作が発生します。-フラグが存在する場合は無視されます。
-
- (オプション) 最小フィールド幅を指定する整数値または
*。必要に応じて、結果はスペース文字でパディングされます (デフォルト)。右寄せの場合は左側に、左寄せの場合は右側にパディングされます。*が使用される場合、幅は int 型の追加の引数によって指定されます。この引数は変換される引数の前に現れ、精度が指定されている場合は精度の引数の前に現れます。引数の値が負の場合、-フラグが指定され、正のフィールド幅になります (注: これは最小幅であり、値が切り捨てられることはありません)。
- (オプション) 最小フィールド幅を指定する整数値または
- (オプション)
.の後に整数値または*が続くか、どちらも続かない精度を指定します。*が使用される場合、精度は int 型の追加の引数によって指定されます。この引数は変換される引数の前に現れますが、最小フィールド幅が指定されている場合はその引数の後に現れます。この引数の値が負の場合、無視されます。数値も*も使用されない場合、精度はゼロとみなされます。精度の正確な効果については以下の表を参照してください。
- (オプション)
- (オプション) 引数のサイズを指定する長さ修飾子 (変換フォーマット指定子と組み合わせて、対応する引数の型を指定します)。
- 変換フォーマット指定子。
以下のフォーマット指定子が利用可能です
| 変換 指定子 |
説明 | 期待される 引数型 | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| 長さ修飾子→ | hh | h | なし | l | ll | j | z | t | L | |
| C++11からのみ利用可能→ | はい | はい | はい | はい | はい | |||||
%
|
リテラル % を書き込みます。完全な変換指定子は %% でなければなりません。 |
N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A |
c
|
単一の文字を書き込みます。
|
N/A | N/A | int |
std::wint_t |
N/A | N/A | N/A | N/A | N/A |
s
|
文字列を書き込みます。
|
N/A | N/A | char* |
wchar_t* |
N/A | N/A | N/A | N/A | N/A |
di
|
符号付き整数を10進数表現 [-]dddd に変換します。
|
signed char |
short |
int |
long |
long long |
※ |
N/A | ||
o
|
符号なし整数を8進数表現 oooo に変換します。
|
unsigned char |
unsigned short |
unsigned int |
unsigned long |
unsigned long long |
std::ptrdiff_t の符号なしバージョン |
N/A | ||
xX
|
符号なし整数を16進数表現 hhhh に変換します。
|
N/A | ||||||||
u
|
符号なし整数を10進数表現 dddd に変換します。
|
N/A | ||||||||
fF (C++11)
|
浮動小数点数を [-]ddd.ddd の形式で10進数表記に変換します。
|
N/A | N/A | double |
double (C++11) |
N/A | N/A | N/A | N/A | long double |
eE
|
浮動小数点数を10進指数表記に変換します。
|
N/A | N/A | N/A | N/A | N/A | N/A | |||
aA
(C++11) |
浮動小数点数を16進指数表記に変換します。
|
N/A | N/A | N/A | N/A | N/A | N/A | |||
gG
|
浮動小数点数を値と精度に応じて10進数または10進指数表記に変換します。
|
N/A | N/A | N/A | N/A | N/A | N/A | |||
n
|
この関数への呼び出しによってこれまでに書き込まれた文字数を返します。
|
signed char* |
short* |
int* |
long* |
long long* |
※ |
N/A | ||
p
|
ポインタを定義する実装定義の文字シーケンスを書き込みます。 |
N/A | N/A | void* |
N/A | N/A | N/A | N/A | N/A | N/A |
| 注釈 | ||||||||||
|
浮動小数点変換関数は無限大を 非数は 変換 char, unsigned char, signed char, short, および unsigned short を印刷するために使用される変換指定子は、デフォルト引数プロモーションの昇格された型を期待しますが、その値を印刷する前に char, unsigned char, signed char, short, および unsigned short に変換されます。可変長関数が呼び出されるときに発生するプロモーションにより、これらの型の値を渡すことは安全です。 固定幅文字型 (std::int8_t など) の正しい変換指定子は、ヘッダ <cinttypes> で定義されています (ただし、PRIdMAX, PRIuMAX などは メモリ書き込み変換指定子 各変換指定子の動作の後にはシーケンスポイントがあります。これにより、同じ変数に複数の 変換指定子が不正な場合、動作は未定義です。 | ||||||||||
[編集] 返り値
[編集] 注意
これらの関数はすべて、少なくとも1回 va_arg を呼び出します。関数の返り値の後、arg の値は未定義です。これらの関数は va_end を呼び出さないため、呼び出し元がそれを行う必要があります。
[編集] 例
#include <cstdarg> #include <cstdio> #include <ctime> #include <vector> void debug_log(const char *fmt, ...) { std::time_t t = std::time(nullptr); char time_buf[100]; std::strftime(time_buf, sizeof time_buf, "%D %T", std::gmtime(&t)); std::va_list args1; va_start(args1, fmt); std::va_list args2; va_copy(args2, args1); std::vector<char> buf(1 + std::vsnprintf(nullptr, 0, fmt, args1)); va_end(args1); std::vsnprintf(buf.data(), buf.size(), fmt, args2); va_end(args2); std::printf("%s [debug]: %s\n", time_buf, buf.data()); } int main() { debug_log("Logging, %d, %d, %d", 1, 2, 3); }
出力
04/13/15 15:09:18 [debug]: Logging, 1, 2, 3
[編集] 関連項目
| (C++11) |
stdout、ファイルストリーム、またはバッファにフォーマットされた出力を書き込む (関数) |
| (C++11)(C++11)(C++11) |
stdin、ファイルストリーム、またはバッファから書式付き入力を読み取ります。 可変長引数リストを使用する (関数) |
| 引数の型消去された表現を用いて、Unicode対応のstdoutまたはファイルストリームに出力する (関数) | |
| 引数の型消去された表現を用いて、stdoutまたはファイルストリームに出力する (関数) | |
| C ドキュメント (vprintf, vfprintf, vsprintf, vsnprintf)
| |