cin/cout 是 istream/ostream 全域物件,綁定標準輸入輸出裝置。本文深入剖析其緩衝互動、格式化提取規則、get/getline 差異與 ignore 活用。
cin 讀取來源。cout 寫入目的地。cerr/clog,無緩衝/全緩衝區別。streambuf 有資料,直接格式化提取。\n)。skipws 旗標)int 解析數字、string 讀至空白)streambuf 移除已消耗字元(gptr 前進)| 目標型別 | 分隔符 | 範例輸入 | 提取結果 | 殘留緩衝區 |
|---|---|---|---|---|
std::string | 空白、\t、\n | hello world\n | "hello" | " world\n" |
char[] | 空白、\t、\n | hello world\n | "hello\0" | " world\n" |
int | 非數字字元 | 123abc\n | 123 | "abc\n" |
char buf[100];
// get():讀取至 \n,**保留 \n 於緩衝區**
cin.get(buf, 100); // 讀 "hello world",緩衝區留 '\n'
cin.get(buf, 100); // 立即讀到 \n → 空字串!
// getline():讀取至 \n,**擷取並丟棄 \n**
cin.getline(buf, 100); // 讀 "hello world",緩衝區乾淨
cin.getline(buf, 100); // 等待下一行輸入
cin.get(buf, 100);
cin.ignore(); // 跳過單一字元(預設 1, '\n')
cin.get(buf, 100); // 正常讀取下一行
// 或一次跳過整行
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
operator<< 完成後**自動 flush**(標準輸出通常行緩衝)。cout << std::flush、cout << std::endl(換行+flush)、cout << '\n'(僅換行)。cerr 無緩衝(unitbuf 旗標),立即輸出,適合錯誤訊息。clog 全緩衝,適合日誌大量輸出。// 關閉 C/C++ 標準流同步(加速純 C++ I/O)
std::ios::sync_with_stdio(false);
// 解除 cin/cout 綁定(進一步加速,但不可混用 printf/scanf)
cin.tie(nullptr);
競程/高效能 I/O 必開雙關閉。
cin >> str 後緩衝區留 \n,後續 getline 讀到空行 → 必須 cin.ignore()。failbit,需 clear() + ignore() 恢復。wcin/wcout 需配合 std::locale 設定正確編碼。