strstreambuf 類別
描述一個資料流緩衝區,該緩衝區可控制儲存在 char
陣列物件中項目序列之間的項目傳輸。
語法
class strstreambuf : public streambuf
備註
根據物件的建構方式,它可以視需要配置、擴充和釋出,以回應序列中的變更。
strstreambuf
類別的物件會將模式的幾個位元資訊儲存為其 strstreambuf
模式。 這些位元表示受控制的序列是否:
已配置,且最後需要釋放。
可修改。
可透過重新配置儲存體來擴充。
已凍結,因此需要解除凍結再終結物件,或由物件以外的代理程式釋放 (如果已配置)。
不論這些個別模式位元的狀態為何,您都無法修改或擴充凍結的受控制序列。
這個物件也會儲存控制 strstreambuf
配置的兩個函式指標。 如果這些指標是 null 指標,則該物件會規劃自己的方法來配置及釋放受控制序列的儲存體。
注意
這個類別已被取代。 請考慮改用 stringbuf 或 wstringbuf。
建構函式
建構函式 | 描述 |
---|---|
strstreambuf | 建構類型 strstreambuf 的物件。 |
成員函式
成員函數 | 描述 |
---|---|
freeze | 導致資料流緩衝區無法在資料流緩衝區作業中使用。 |
overflow | 受保護的虛擬函式,可在將新字元插入已滿的緩衝區時呼叫。 |
pbackfail | 嘗試將項目放回輸入資料流,然後將其設為目前項目 (由下一個指標指向) 的受保護虛擬成員函式。 |
pcount | 傳回寫入至受控制序列的元素計數。 |
seekoff | 受保護虛擬成員函式嘗試改變受控制資料流目前的位置。 |
seekpos | 受保護虛擬成員函式嘗試改變受控制資料流目前的位置。 |
str | 呼叫 freeze,然後傳回指向受控制序列開頭的指標。 |
underflow | 要從輸入資料流擷取目前項目的受保護虛擬函式。 |
需求
Header:<strstream>
命名空間:std
strstreambuf::freeze
導致資料流緩衝區無法在資料流緩衝區作業中使用。
void freeze(bool _Freezeit = true);
參數
_Freezeit
bool
,指出您是否要凍結資料流。
備註
如果 _Freezeit 為 true,函式會改變預 strstreambuf
存模式,使受控制序列凍結。 否則,不會凍結受控制的序列。
str 表示 freeze
。
注意
凍結的緩衝區將不會在 strstreambuf
解構期間釋放。 您必須先取消凍結緩衝區,之後才能釋放它以避免記憶體流失。
範例
// strstreambuf_freeze.cpp
// compile with: /EHsc
#include <iostream>
#include <strstream>
using namespace std;
void report(strstream &x)
{
if (!x.good())
cout << "stream bad" << endl;
else
cout << "stream good" << endl;
}
int main()
{
strstream x;
x << "test1";
cout << "before freeze: ";
report(x);
// Calling str freezes stream.
cout.write(x.rdbuf()->str(), 5) << endl;
cout << "after freeze: ";
report(x);
// Stream is bad now, wrote on frozen stream
x << "test1.5";
cout << "after write to frozen stream: ";
report(x);
// Unfreeze stream, but it is still bad
x.rdbuf()->freeze(false);
cout << "after unfreezing stream: ";
report(x);
// Clear stream
x.clear();
cout << "after clearing stream: ";
report(x);
x << "test3";
cout.write(x.rdbuf()->str(), 10) << endl;
// Clean up. Failure to unfreeze stream will cause a
// memory leak.
x.rdbuf()->freeze(false);
}
before freeze: stream good
test1
after freeze: stream good
after write to frozen stream: stream bad
after unfreezing stream: stream bad
after clearing stream: stream good
test1test3
strstreambuf::overflow
受保護的虛擬函式,可在將新字元插入已滿的緩衝區時呼叫。
virtual int overflow(int _Meta = EOF);
參數
_元
要插入緩衝區的字元,或 EOF
。
傳回值
如果函式不成功,則會傳回 EOF
。 否則,如果_Meta == EOF
,它會傳回以外的EOF
一些值。 否則,它會傳 回_Meta。
備註
如果 _Meta != EOF
,受保護的虛擬成員函式會嘗試將專案 (char)_Meta
插入輸出緩衝區。 它可以透過下列各種方式來執行:
如果有寫入位置可供使用,它可以將項目儲存至寫入位置,並遞增輸出緩衝區的下一個指標。
如果儲存的 strstreambuf 模式表示受控制的序列是可修改、可擴充且未凍結的,則函式可為輸出緩衝區配置新的指標,藉以使寫入位置可供使用。 以這種方式擴充輸出緩衝區時,也會擴充任何相關的輸入緩衝區。
strstreambuf::p backfail
受保護的虛擬成員函式,會嘗試將項目放回輸入資料流,然後將其設成目前的項目 (由下一個指標指向)。
virtual int pbackfail(int _Meta = EOF);
參數
_元
要插入緩衝區的字元,或 EOF
。
傳回值
如果函式不成功,則會傳回 EOF
。 否則,如果_Meta == EOF
,它會傳回以外的EOF
一些值。 否則,它會傳 回_Meta。
備註
受保護的虛擬成員函式會嘗試將元素放回輸入緩衝區,然後將其設成目前的元素 (由下一個指標指向)。
如果 _Meta == EOF
,則要回推的項目實際上是目前專案之前已在數據流中的元素。 否則,該專案會取代為 ch = (char)_Meta
。 此函式可以透過下列各種方式來放回元素:
如果有可用的放回位置,而儲存在那裡的項目會比較等於
ch
,它可以遞減輸入緩衝區的下一個指標。如果有可用的重播位置,而且 strstreambuf 模式表示受控制序列是可修改的,則函式可以儲存
ch
到放回位置,並遞減輸入緩衝區的下一個指標。
strstreambuf::p count
傳回寫入至受控制序列的元素計數。
streamsize pcount() const;
傳回值
寫入受控制序列的項目計數。
備註
具體來說,如果 pptr 是 null 指標,此函式會傳回零。 否則會傳pptr
- 回 pbase。
範例
// strstreambuf_pcount.cpp
// compile with: /EHsc
#include <iostream>
#include <strstream>
using namespace std;
int main( )
{
strstream x;
x << "test1";
cout << x.rdbuf( )->pcount( ) << endl;
x << "test2";
cout << x.rdbuf( )->pcount( ) << endl;
}
strstreambuf::seekoff
受保護虛擬成員函式嘗試改變受控制資料流目前的位置。
virtual streampos seekoff(streamoff _Off,
ios_base::seekdir _Way,
ios_base::openmode _Which = ios_base::in | ios_base::out);
參數
_Off
要尋找相對於 _Way的位置。
_道路
位移作業的起點。 如需可能的值,請參閱 seekdir。
_哪
指定指標位置的模式。 預設為允許您修改讀取和寫入位置。
傳回值
如果函式成功改變一個或兩個資料流位置,則會傳回結果資料流位置。 否則會失敗,並傳回無效的資料流位置。
備註
受保護虛擬成員函式會致力於改變受控制資料流的目前位置。 針對 strstreambuf 類別的物件,資料流位置完全是由資料流位移所組成。 位移零指定受控制序列的第一個元素。
新位置的判斷如下:
如果
_Way == ios_base::beg
為 ,則新位置是數據流開頭加上 _Off。如果
_Way == ios_base::cur
為 ,則新位置是目前的數據流位置加上 _Off。如果
_Way == ios_base::end
為 ,則新位置是數據流結尾加上 _Off。
如果 _Which & ios_base::in
為非零,且輸入緩衝區存在,則函式會改變下一個位置以在輸入緩衝區中讀取。 如果 _Which & ios_base::out
也是非零, _Way != ios_base::cur
而且輸出緩衝區存在,則函式也會設定要寫入的下一個位置,以符合要讀取的下一個位置。
否則,如果 _Which & ios_base::out
為非零值,且輸入緩衝區存在,函式就會改變輸出緩衝區中下一個要寫入的位置。 否則,置放作業會失敗。 若要讓置放作業能夠成功,產生的資料流位置必須位於受控制的序列內。
strstreambuf::seekpos
受保護虛擬成員函式嘗試改變受控制資料流目前的位置。
virtual streampos seekpos(streampos _Sp, ios_base::openmode _Which = ios_base::in | ios_base::out);
參數
_Sp
要搜尋的位置。
_哪
指定指標位置的模式。 預設為允許您修改讀取和寫入位置。
傳回值
如果函式成功改變一個或兩個資料流位置,則會傳回結果資料流位置。 否則會失敗,並傳回無效的資料流位置。 若要判斷資料流位置是否無效,請比較傳回值與 pos_type(off_type(-1))
。
備註
受保護虛擬成員函式會致力於改變受控制資料流的目前位置。 針對 strstreambuf 類別的物件,資料流位置完全是由資料流位移所組成。 位移零指定受控制序列的第一個元素。 新位置取決於 _Sp。
如果 _Which
& ios_base::in 為非零,且輸入緩衝區存在,則函式會改變下一個在輸入緩衝區中讀取的位置。 如果 _Which
和 ios_base::out
不是零,而且輸出緩衝區存在,函式也會設定要寫入的下一個位置以符合要讀取的下一個位置。 否則,如果 _Which
& ios_base::out
為非零,且輸出緩衝區存在,則函式會改變下一個要寫入輸出緩衝區的位置。 否則,置放作業會失敗。 若要讓置放作業能夠成功,產生的資料流位置必須位於受控制的序列內。
strstreambuf::str
呼叫 freeze,然後傳回指向受控制序列開頭的指標。
char *str();
傳回值
指向受控制序列開頭的指標。
備註
除非您明確地插入一個,否則不會有終止的 null 項目存在。
範例
如需使用 str 的範例,請參閱 strstreambuf::freeze。
strstreambuf::strstreambuf
建構類型 strstreambuf
的物件。
explicit strstreambuf(streamsize count = 0);
strstreambuf(void (* alloc_func)(size_t),
void (* free_func)(void*));
strstreambuf(char* getptr,
streamsize count,
char* putptr = 0);
strstreambuf(signed char* getptr,
streamsize count,
signed char* putptr = 0);
strstreambuf(unsigned char* getptr,
streamsize count,
unsigned char* putptr = 0);
strstreambuf(const char* getptr,
streamsize count);
strstreambuf(const signed char* getptr,
streamsize count);
strstreambuf(const unsigned char* getptr,
streamsize count);
參數
alloc_func
用於配置記憶體緩衝區的函式。
計數
決定 getptr 所指向之緩衝區的長度。 如果 getptr 不是自變數(第一個建構函式形式),則為緩衝區建議的配置大小。
_Freefunc
用於釋放記憶體緩衝區的函式。
getptr
用於輸入的緩衝區。
putptr
用於輸出的緩衝區。
備註
第一個建構函式會在控制輸入緩衝區、輸出緩衝區及 strstreambuf 配置的所有指標中儲存一個 null 指標。 它會設定儲存的 strstreambuf 模式,以使受控制的序列成為可修改且可擴充的。 它也接受 計數 作為建議的初始配置大小。
第二個建構函式的行為與第一個建構函式類似,不同之處在於它會將alloc_func儲存為要呼叫以配置記憶體的函式指標,並將free_func做為函式的指標,以呼叫釋放該記憶體。
這三個建構函式:
strstreambuf(char *getptr,
streamsize count,
char *putptr = 0);
strstreambuf(signed char *getptr,
streamsize count,
signed char *putptr = 0);
strstreambuf(unsigned char *getptr,
streamsize count,
unsigned char *putptr = 0);
也的行為就像第一個,不同之處在於 getptr 會指定用來保存受控制序列的數位物件。 (因此,它不得為 Null 指標。陣列中的元素 N 數目取決於如下:
如果為 (count> 0),則 N 為 count。
如果 (count == 0),則 N 為
strlen((const char *) getptr )
。如果為 (count< 0),則 N 會INT_MAX。
如果 putptr 是 Null 指標,則函式會執行下列命令,只建立輸入緩衝區:
setg(getptr,
getptr,
getptr + N);
否則,它會執行下列程式碼,來建立輸入和輸出緩衝區:
setg(getptr,
getptr,
putptr);
setp(putptr,
getptr + N);
在此情況下,putptr 必須在 interval [ getptr, getptr + N]。
最後,這三個建構函式:
strstreambuf(const char *getptr,
streamsize count);
strstreambuf(const signed char *getptr,
streamsize count);
strstreambuf(const unsigned char *getptr,
streamsize count);
全都會以如下的方式運作:
streambuf((char *)getptr, count);
但有個例外是,儲存的模式會使受控制的序列變成不可修改且不可擴充的。
strstreambuf::underflow
要從輸入資料流擷取目前項目的受保護虛擬函式。
virtual int underflow();
傳回值
如果函式不成功,則會傳回 EOF
。 否則會傳回輸入資料流中目前的項目 (已如上所述進行轉換)。
備註
受保護的虛擬成員函式會努力從輸入緩衝區擷取目前的專案 ch
,然後前進目前的數據流位置,並將專案傳回為 (int)(unsigned char)ch
。 它只能以單一方式執行此動作:如果有可用的讀取位置,它會接受 ch
儲存在讀取位置中的元素,並前進輸入緩衝區的下一個指標。