命名空間
變體
動作

std::basic_streambuf

出自 cppreference.com
< cpp‎ | io
 
 
 
 
定義於標頭檔 <streambuf>
template<

    class CharT,
    class Traits = std::char_traits<CharT>

> class basic_streambuf;

basic_streambuf 類別控制字元序列的輸入與輸出。它包含並提供了對下列項目的存取:

  1. 「受控字元序列」(Controlled character sequence),也稱為「緩衝區」(buffer),其可能包含用於緩衝輸入操作的「輸入序列」(也稱為「取得區域」,get area)和/或用於緩衝輸出操作的「輸出序列」(也稱為「放置區域」,put area)。
  2. 「關聯字元序列」(Associated character sequence),也稱為「來源」(用於輸入)或「接收器」(用於輸出)。這可能是一個透過作業系統 API 存取的實體(檔案、TCP socket、序列埠、其他字元裝置),或者可能是一個可以被解釋為字元來源或接收器的物件(std::vector陣列字串實字)。

I/O 資料流物件 std::basic_istreamstd::basic_ostream,以及所有衍生自它們的物件(std::ofstreamstd::stringstream 等),其實現完全基於 std::basic_streambuf

受控字元序列是一個 CharT 陣列,它始終代表關聯字元序列的一個子序列或「視窗」。其狀態由三個指標描述:

  1. 「起始指標」(beginning pointer),始終指向緩衝區的最底層元素。
  2. 「下一個指標」(next pointer),指向作為下一個讀取或寫入候選者的元素。
  3. 「結尾指標」(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_filebufstd::basic_stringbuf)皆繼承自 std::basic_streambuf

std-streambuf.svg

為常見的字元型別提供了數個 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) [編輯]
English Deutsch 日本語 中文(简体) 中文(繁體)