stdin, stdout, stderr
From cppreference.com
| ヘッダ <cstdio>で定義 |
||
| #define stdin /* 実装依存 */ |
(1) | |
| #define stdout /* 実装依存 */ |
(2) | |
| #define stderr /* 実装依存 */ |
(3) | |
3つのテキストストリームが事前に定義されています。これらのストリームは、プログラム起動時に暗黙的に開かれ、未初期化状態です。
1) 標準入力ストリームに関連付けられており、通常の入力を読み取るために使用されます。プログラム起動時、ストリームが対話型デバイスを参照しないと判断できる場合にのみ、ストリームはフルバッファリングされます。
2) 標準出力ストリームに関連付けられており、通常の書き込みに使用されます。プログラム起動時、ストリームが対話型デバイスを参照しないと判断できる場合にのみ、ストリームはフルバッファリングされます。
3) 標準エラーストリームに関連付けられており、診断メッセージの書き込みに使用されます。プログラム起動時、ストリームはフルバッファリングされません。
対話型デバイスが何であるかは、実装によって定義されます。
これらのマクロは、std::FILE* 型の式に展開されます。
[編集] 注記
POSIXによって義務付けられているわけではありませんが、UNIXの慣習では、stdinとstdoutは端末に関連付けられている場合はラインバッファリングされ、stderrはバッファリングされません。
これらのマクロは、変更可能な左辺値に展開される場合があります。これらのstd::FILE*左辺値のいずれかが変更された場合、対応するストリームに対する後続の操作は、未規定または未定義の動作につながります。
[編集] 例
この例は、std::printfに似た関数を示しています。
このコードを実行
#include <concepts> #include <cstdio> #include <type_traits> template<typename T> concept IsPrintable = std::integral<T> or std::floating_point<T> or std::is_pointer_v<T>; int my_printf(char const* const format, IsPrintable auto const ... arguments) { return std::fprintf(stdout, format, arguments...); } int main(int argv, char*[]) { my_printf("Strings and chars:\t%s %c\n", "hello", 'x'); my_printf("Rounding:\t\t%f %.0f %.32f\n", 1.5, 1.5, 1.3); my_printf("Padding:\t\t%05.2f %.2f %5.2f\n", 1.5, 1.5, 1.5); my_printf("Scientific:\t\t%E %e\n", 1.5, 1.5); my_printf("Hexadecimal:\t\t%a %A 0x%X\n", 1.5, 1.5, &argv); }
実行結果の例
Strings and chars: hello x Rounding: 1.500000 2 1.30000000000000004440892098500626 Padding: 01.50 1.50 1.50 Scientific: 1.500000E+00 1.500000e+00 Hexadecimal: 0x1.8p+0 0X1.8P+0 0x2CFB41BC
[編集] 関連項目
| 標準C入力ストリームstdinから読み取ります (グローバルオブジェクト) | |
| 標準C出力ストリームstdoutに書き込みます (グローバルオブジェクト) | |
| 標準Cエラー出力ストリームstderrに書き込みます(バッファリングなし) (グローバルオブジェクト) | |
| 標準Cエラー出力ストリームstderrに書き込みます (グローバルオブジェクト) | |
| (C++11) |
フォーマットされた出力をstdout、ファイルストリーム、またはバッファに書き込みます (関数) |
| Cの入出力ストリームを制御するために必要なすべての情報を保持できるオブジェクト型 (typedef) | |
| Cドキュメント(stdin, stdout, stderr)
| |