C++ 標準程式庫提供的 IO 流體系(<iostream>、<fstream>、<sstream>)以型別安全、可擴充、支援使用者定義型別為特色,取代 C 風格的 stdio.h。本文系統整理常用輸入輸出操作、流狀態控制、緩衝區管理、檔案與字串流操作,並附帶最佳實踐範例。
| 類別 | 頭文件 | 用途 |
|---|---|---|
istream | <iostream> | 輸入流基類 |
ostream | <iostream> | 輸出流基類 |
iostream | <iostream> | 雙向流(多重繼承) |
ifstream | <fstream> | 檔案輸入 |
ofstream | <fstream> | 檔案輸出 |
fstream | <fstream> | 檔案雙向 |
istringstream | <sstream> | 字串輸入 |
ostringstream | <sstream> | 字串輸出 |
stringstream | <sstream> | 字串雙向 |
關鍵規則:流物件不可複製/賦值,函數參數/回傳值必須用引用(istream&, ostream&)。
getline(is, str) | 讀整行(含空白),遇 \n 停止 | 讀取含空格的完整行 |
| getline(is, str, delim) | 讀至指定分隔字元 | CSV 解析、自訂分隔 |
| cin >> str | 讀單詞(跳過空白,遇空白停止) | 簡單詞彙輸入 |
| cin.getline(buf, n, delim) | 讀至字元陣列,C 風格 | 舊代碼相容 |
| getchar() / cin.get() | 讀單一字元 | 字元級處理 |
// 狀態查詢
s.eof() // 到達檔案結尾
s.fail() // 格式錯誤或邏輯錯誤
s.bad() // 系統級錯誤(不可恢復)
s.good() // 以上皆無,可繼續操作
// 狀態重置
s.clear() // 清除所有錯誤旗標
s.clear(flags) // 設定指定旗標
s.setstate(flags) // 新增旗標(保留既有)
s.rdstate() // 取得當前旗標組合
endl:換行 + 刷新flush:僅刷新ends:插入 \0 + 刷新unitbuf:每次輸出後自動刷新(cout << unitbuf);nounitbuf 恢復預設。// 開啟模式組合(位元或)
ofstream out("log.txt", ios::out | ios::app | ios::binary);
// 重新綁定檔案
ifstream in("a.txt");
in.close();
in.clear(); // 必須清除狀態
in.open("b.txt"); // 重新開啟
| 模式旗標 | 說明 | 適用類別 |
|---|---|---|
in | 讀取 | ifstream, fstream |
out | 寫入 | ofstream, fstream |
app | 每次寫入前定位檔案尾 | ofstream, fstream |
ate | 開啟後立即定位檔案尾 | 所有 |
trunc | 截斷檔案 | ofstream, fstream |
binary | 二進位模式 | 所有 |
ostringstream oss;
oss << "val1: " << 512 << '\n'
<< "val2: " << 1024 << '\n';
string formatted = oss.str(); // 取得完整字串
istringstream iss(formatted);
string dummy;
int v1, v2;
iss >> dummy >> v1 >> dummy >> v2; // v1=512, v2=1024
string line, word;
while (getline(cin, line)) {
istringstream iss(line);
while (iss >> word) {
// 處理每個單詞
}
}
getline 讀行,再用 istringstream 解析,避免 >> 殘留換行符導致後續讀取異常。close() 再 clear() 才能重新開啟新檔案。sync_with_stdio(false) 並解除 cin.tie(nullptr) 提升效能。ios::binary,避免 Windows 下換行符轉換破壞資料。C++ IO 流庫雖介面龐大,但核心概念清晰:流抽象 + 狀態機 + 格式化。熟練掌握三大流家族(標準、檔案、字串)的建立、狀態檢查、緩衝控制與格式化解析,即可優雅處理絕大多數輸入輸出需求。