std::basic_streambuf
| 定義於標頭檔 <streambuf> |
||
| template< class CharT, |
||
basic_streambuf 類別控制字元序列的輸入與輸出。它包含並提供了對下列項目的存取:
- 「受控字元序列」(Controlled character sequence),也稱為「緩衝區」(buffer),其可能包含用於緩衝輸入操作的「輸入序列」(也稱為「取得區域」,get area)和/或用於緩衝輸出操作的「輸出序列」(也稱為「放置區域」,put area)。
- 「關聯字元序列」(Associated character sequence),也稱為「來源」(用於輸入)或「接收器」(用於輸出)。這可能是一個透過作業系統 API 存取的實體(檔案、TCP socket、序列埠、其他字元裝置),或者可能是一個可以被解釋為字元來源或接收器的物件(std::vector、陣列、字串實字)。
I/O 資料流物件 std::basic_istream 和 std::basic_ostream,以及所有衍生自它們的物件(std::ofstream、std::stringstream 等),其實現完全基於 std::basic_streambuf。
受控字元序列是一個 CharT 陣列,它始終代表關聯字元序列的一個子序列或「視窗」。其狀態由三個指標描述:
- 「起始指標」(beginning pointer),始終指向緩衝區的最底層元素。
- 「下一個指標」(next pointer),指向作為下一個讀取或寫入候選者的元素。
- 「結尾指標」(end pointer),指向緩衝區末端之後的一個位置。
basic_streambuf 物件可以同時支援輸入(此時由起始、下一個和結尾指標所描述的緩衝區稱為「取得區域」)、輸出(「放置區域」),或者同時支援輸入與輸出。在後者的情況下,會追蹤六個指標,這些指標可能全部指向同一個字元陣列中的元素,或是指向兩個不同的陣列。
如果放置區域中的下一個指標小於結尾指標,則表示有「寫入位置」可用。該下一個指標可以被取值(dereferenced)並被賦值。
如果取得區域中的下一個指標小於結尾指標,則表示有「讀取位置」可用。該下一個指標可以被取值並被讀取。
如果取得區域中的下一個指標大於起始指標,則表示有「放回位置」(putback position)可用,並且可以將下一個指標遞減、取值並賦值,以便將一個字元放回取得區域中。
受控序列中的字元表示與編碼可能與關聯序列中的字元表示不同,在此情況下通常會使用 std::codecvt 地區設定元(locale facet)來執行轉換。常見的例子是透過 std::wfstream 物件存取的 UTF-8(或其他多位元組)檔案:受控序列由 wchar_t 字元組成,但關聯序列由位元組組成。
std::basic_streambuf 基底類別的典型實作僅保留六個 CharT* 指標以及一個 std::locale 的副本作為資料成員。此外,實作可能會保留地區設定元的快取副本,這些副本在每次呼叫 imbue() 時都會失效。具體的緩衝區(如 std::basic_filebuf 或 std::basic_stringbuf)皆繼承自 std::basic_streambuf。
為常見的字元型別提供了數個 typedef:
| 定義於標頭檔
<streambuf> | |
| 類型 | 定義 |
std::streambuf
|
std::basic_streambuf<char> |
std::wstreambuf
|
std::basic_streambuf<wchar_t> |
目錄 |
[編輯] 成員型別
| 成員型別 | 定義 |
char_type
|
CharT |
traits_type
|
Traits;若 Traits::char_type 不為 CharT,則程式形式不良 (ill-formed)。 |
int_type
|
Traits::int_type |
pos_type
|
Traits::pos_type |
off_type
|
Traits::off_type |
[編輯] 成員函數
| [虛擬] |
解構 basic_streambuf 物件(虛擬公開成員函數) |
在地化 (Locales) | |
| 變更關聯的地區設定並呼叫 imbue() (公開成員函數) | |
| 取得關聯地區設定的複本 (公開成員函數) | |
定位 | |
| 呼叫 setbuf() (公開成員函數) | |
| 呼叫 seekoff() (公開成員函數) | |
| 呼叫 seekpos() (公開成員函數) | |
| 呼叫 sync() (公開成員函數) | |
讀取區 (Get area) | |
| 取得讀取區中立即可用的字元數 (公開成員函數) | |
| 推進輸入序列,然後讀取一個字元而不再次推進 (公開成員函數) | |
| (C++17 移除) |
從輸入序列讀取一個字元並推進序列 (公開成員函數) |
| 從輸入序列讀取一個字元而不推進序列 (公開成員函數) | |
| 呼叫 xsgetn() (公開成員函數) | |
寫入區 (Put area) | |
| 將一個字元寫入寫入區並推進下一個指標 (公開成員函數) | |
| 呼叫 xsputn() (公開成員函數) | |
回寫 (Putback) | |
| 將一個字元放回輸入序列 (公開成員函數) | |
| 將輸入序列中的下一個指標向後移動一個位置 (公開成員函數) | |
受保護的成員函式 | |
建構一個 basic_streambuf 物件(受保護成員函式) | |
| (C++11) |
替換一個 basic_streambuf 物件(受保護成員函式) |
| (C++11) |
交換兩個 basic_streambuf 物件(受保護成員函式) |
在地化 (Locales) | |
| [虛擬] |
對相關地區設定的變更做出反應 (虛擬受保護成員函數) |
定位 | |
| [虛擬] |
在許可的情況下,以使用者定義的陣列替換緩衝區 (虛擬受保護成員函數) |
| [虛擬] |
使用相對定址,重新定位輸入序列、輸出序列或兩者的下一個指標 (虛擬受保護成員函數) |
| [虛擬] |
使用絕對定址,重新定位輸入序列、輸出序列或兩者的下一個指標 (虛擬受保護成員函數) |
| [虛擬] |
將緩衝區與關聯的字元序列同步 (虛擬受保護成員函數) |
讀取區 (Get area) | |
| [虛擬] |
取得關聯輸入序列中可供輸入的字元數(若已知) (虛擬受保護成員函數) |
| [虛擬] |
從關聯的輸入序列讀取字元至讀取區 (虛擬受保護成員函數) |
| [虛擬] |
從關聯的輸入序列讀取字元至讀取區並推進下一個指標 (虛擬受保護成員函數) |
| [虛擬] |
從輸入序列讀取多個字元 (虛擬受保護成員函數) |
| 回傳指向讀取區開頭、當前字元及結尾的指標 (受保護成員函式) | |
| 推進輸入序列中的下一個指標 (受保護成員函式) | |
| 重新定位輸入序列的開頭、下一個及結尾指標 (受保護成員函式) | |
寫入區 (Put area) | |
| [虛擬] |
將多個字元寫入輸出序列 (虛擬受保護成員函數) |
| [虛擬] |
將寫入區的字元寫入關聯的輸出序列 (虛擬受保護成員函數) |
| 回傳指向寫入區開頭、當前字元及結尾的指標 (受保護成員函式) | |
| 推進輸出序列中的下一個指標 (受保護成員函式) | |
| 重新定位輸出序列的開頭、下一個及結尾指標 (受保護成員函式) | |
回寫 (Putback) | |
| [虛擬] |
將字元放回輸入序列,可能會修改輸入序列 (虛擬受保護成員函數) |
[編輯] 參見
| 物件型別,能夠保存控制 C I/O 串流所需的所有資訊 (typedef) |