首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C++ 標準 IO 流庫完整指南:輸入輸出、檔案、字串流與狀態控制

     編輯:關於C語言

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) {
        // 處理每個單詞
    }
}

最佳實踐摘要

  1. 優先使用 getline 讀行,再用 istringstream 解析,避免 >> 殘留換行符導致後續讀取異常。
  2. 檔案操作失敗後,記得 close() 再 clear() 才能重新開啟新檔案。
  3. 大量輸出時考慮關閉 sync_with_stdio(false) 並解除 cin.tie(nullptr) 提升效能。
  4. 二進位資料讀寫請加上 ios::binary,避免 Windows 下換行符轉換破壞資料。

總結

C++ IO 流庫雖介面龐大,但核心概念清晰:流抽象 + 狀態機 + 格式化。熟練掌握三大流家族(標準、檔案、字串)的建立、狀態檢查、緩衝控制與格式化解析,即可優雅處理絕大多數輸入輸出需求。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved