stdin, stdout, stderr
出自 cppreference.com
| 定義於標頭檔 <cstdio> |
||
| #define stdin /* 由實作定義 */ |
(1) | |
| #define stdout /* 由實作定義 */ |
(2) | |
| #define stderr /* 由實作定義 */ |
(3) | |
預定義了三個文字串流。這些串流在程式啟動時會隱式開啟,且為無導向(unoriented)狀態。
1) 關聯至標準輸入串流,用於讀取常規輸入。在程式啟動時,若且唯若該串流被確定不指向互動式裝置,該串流才會被全緩衝(fully buffered)。
2) 關聯至標準輸出串流,用於寫入常規輸出。在程式啟動時,若且唯若該串流被確定不指向互動式裝置,該串流才會被全緩衝。
3) 關聯至標準錯誤串流,用於寫入診斷輸出。在程式啟動時,該串流不會被全緩衝。
何謂互動式裝置由實作定義。
這些巨集會展開為型別為 std::FILE* 的運算式。
[編輯] 備註
雖然 POSIX 並未強制規定,但 UNIX 的慣例是:若 stdin 和 stdout 關聯至終端機,則它們為行緩衝(line-buffered),而 stderr 則為無緩衝。
這些巨集可能會展開為可修改的左值(lvalue)。若任何此類 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 I/O 串流所需的所有資訊 (typedef) | |
| C 文件 關於 stdin, stdout, stderr
| |