C++ iostreams 以 streambuf 抽象緩衝區操作。本文深入解析緩衝區架構、雙指標機制、rdbuf() 進階用法與定位操作。
streambuf* 指標,指向衍生自 basic_streambuf<CharT, Traits> 的緩衝區物件。rdbuf() 返回該指標,允許直接操作緩衝區。std::ifstream fin("1.txt");
std::cout << fin.rdbuf() << std::endl; // 一次性輸出檔案全部內容
運作機制:operator<<(streambuf*) 從緩衝區 gptr 讀取至 EOF。
std::ifstream fin("1.txt");
std::string str;
fin >> str; // 提取第一個詞,gptr 前進
std::cout << fin.rdbuf(); // 輸出「剩餘」內容(gptr 之後)

| 函式 | 適用流向 | 操作目標 | 參考點 |
|---|---|---|---|
seekg(pos) | 輸入 | get pointer | beg/cur/end |
seekp(pos) | 輸出 | put pointer | beg/cur/end |
tellg() | 輸入 | 回傳 get pointer 位置 (streampos) | - |
tellp() | 輸出 | 回傳 put pointer 位置 (streampos) | - |
std::ifstream fin("1.txt");
std::streampos pos = fin.tellg(); // 記錄初始位置 (0)
std::string word;
fin >> word; // 讀取第一個詞
fin.seekg(pos); // 回到開頭
std::cout << fin.rdbuf(); // 重新輸出完整檔案
#define PRINTCURPOS(in) std::cout << "cur pos: " << in.tellg() << std::endl
#define PRINTANDEXEC(st) std::cout << #st << std::endl; st
int main() {
PRINTANDEXEC(std::ifstream fin("1.txt"));
PRINTANDEXEC(std::string str);
PRINTCURPOS(fin); // 0
PRINTANDEXEC(fin >> str); // 讀取 "hello"
PRINTCURPOS(fin); // 6 (含空白)
PRINTANDEXEC(fin.seekg(2, std::ios::beg));
PRINTCURPOS(fin); // 2
PRINTANDEXEC(std::cout << fin.rdbuf() << std::endl); // 從位置2輸出
PRINTCURPOS(fin); // 檔案末尾
}

std::streambuf,覆寫虛函式:
underflow():輸入緩衝區空時填充資料overflow():輸出緩衝區滿時排洩資料sync():同步緩衝區至外部裝置seekoff()/seekpos():支援定位setg()、setp() 設定內部緩衝區指標(eback/gptr/egptr、pbase/pptr/epptr)。rdbuf() 輸出**不保證**為完整檔案內容,取決於當前 gptr 位置。seekg 僅對輸入流有效,ofstream 無此函式;seekp 僅對輸出流有效。tellg/tellp 回傳 streampos(實作為 fpos<mbstate_t>),不可直接當整數運算,需轉換。fstream 擁有獨立 get/put 指標,互不影響。