C++ iostreams 以模板化架構支援窄/寬字元統一介面。本文系統梳理標頭檔層級、核心型別定義、iosfwd 向前宣告機制與全域流物件。
| 標頭檔 | 用途 | 包含關係 |
|---|---|---|
<iostream> | 最常用,宣告 cin/cout/cerr/clog 等全域物件 | 包含 <istream>、<ostream> |
<istream> | 輸入流類別定義 | 包含 <ios> |
<ostream> | 輸出流類別定義 | 包含 <ios> |
<ios> | 基礎類別 ios_base、basic_ios | 包含 <iosfwd> |
<iosfwd> | **向前宣告**,僅型別名稱,無定義 | 最輕量,適合標頭檔包含 |
<fstream> | 檔案流 ifstream/ofstream/fstream | 包含 <istream>/<ostream> |
<sstream> | 字串流 istringstream/ostringstream/stringstream | 包含 <istream>/<ostream> |
<streambuf> | 緩衝區基類 basic_streambuf | 底層核心 |
<iomanip> | 格式化操控子 setw/setprecision/hex 等 | 獨立 |
<strstream> | 舊式字串流(已棄用) | 勿用於新代碼 |
template <class CharT, class Traits = char_traits<CharT>>
class basic_ios; // 基礎流狀態、旗標、區域設定
template <class CharT, class Traits>
class basic_streambuf; // 緩衝區核心
template <class CharT, class Traits>
class basic_istream; // 輸入流 (operator>>)
template <class CharT, class Traits>
class basic_ostream; // 輸出流 (operator<<)
template <class CharT, class Traits>
class basic_iostream; // 雙向流
// 具象化別名
using ios = basic_ios<char>;
using streambuf = basic_streambuf<char>;
using istream = basic_istream<char>;
using ostream = basic_ostream<char>;
using iostream = basic_iostream<char>;
using wios = basic_ios<wchar_t>;
using wstreambuf = basic_streambuf<wchar_t>;
using wistream = basic_istream<wchar_t>;
using wostream = basic_ostream<wchar_t>;
using wiostream = basic_iostream<wchar_t>;
// 檔案流
using filebuf = basic_filebuf<char>;
using ifstream = basic_ifstream<char>;
using ofstream = basic_ofstream<char>;
using fstream = basic_fstream<char>;
// 字串流
using stringbuf = basic_stringbuf<char>;
using istringstream = basic_istringstream<char>;
using ostringstream = basic_ostringstream<char>;
using stringstream = basic_stringstream<char>;
// 寬字元版對應 wfilebuf、wifstream...、wstringbuf、wistringstream...
| 窄字元 | 寬字元 | 用途 | 緩衝特性 |
|---|---|---|---|
cin | wcin | 標準輸入 | 行緩衝 |
cout | wcout | 標準輸出 | 行緩衝 (互動式) / 全緩衝 (重導向) |
cerr | wcerr | 標準錯誤 | **無緩衝** (unitbuf) |
clog | wclog | 標準日誌 | 全緩衝 |
<iosfwd> 僅包含類別模板宣告與 typedef,**無任何定義、無內建函式實作**,解決:
**最佳實踐**:標頭檔僅需流參考/指標參數時,包含 <iosfwd>;實作檔才包含完整標頭檔。
cin/cout/cerr/clog 在第一次使用前完成建構(ios_base::Init 機制)。<iostream> 即觸發初始化,無需手動干預。| 需求 | 類別 | 標頭檔 |
|---|---|---|
| 格式化輸入 | istream / ifstream / istringstream | <istream> / <fstream> / <sstream> |
| 格式化輸出 | ostream / ofstream / ostringstream | <ostream> / <fstream> / <sstream> |
| 雙向操作 | iostream / fstream / stringstream | <iostream> / <fstream> / <sstream> |
| 直接緩衝區操作 | streambuf / filebuf / stringbuf | <streambuf> / <fstream> / <sstream> |
| 格式化控制 | 操控子 setw, setfill, hex 等 | <iomanip> |