共用方式為


strstreambuf 類別

描述一個資料流緩衝區,該緩衝區可控制儲存在 char 陣列物件中項目序列之間的項目傳輸。

語法

class strstreambuf : public streambuf

備註

根據物件的建構方式,它可以視需要配置、擴充和釋出,以回應序列中的變更。

strstreambuf 類別的物件會將模式的幾個位元資訊儲存為其 strstreambuf 模式。 這些位元表示受控制的序列是否:

  • 已配置,且最後需要釋放。

  • 可修改。

  • 可透過重新配置儲存體來擴充。

  • 已凍結,因此需要解除凍結再終結物件,或由物件以外的代理程式釋放 (如果已配置)。

不論這些個別模式位元的狀態為何,您都無法修改或擴充凍結的受控制序列。

這個物件也會儲存控制 strstreambuf 配置的兩個函式指標。 如果這些指標是 null 指標,則該物件會規劃自己的方法來配置及釋放受控制序列的儲存體。

注意

這個類別已被取代。 請考慮改用 stringbufwstringbuf

建構函式

建構函式 描述
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 為非零,且輸入緩衝區存在,則函式會改變下一個在輸入緩衝區中讀取的位置。 如果 _Whichios_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),則 Ncount

  • 如果 (count == 0),則 Nstrlen((const char *) getptr )

  • 如果為 (count< 0),則 NINT_MAX

如果 putptr 是 Null 指標,則函式會執行下列命令,只建立輸入緩衝區:

setg(getptr,
    getptr,
    getptr + N);

否則,它會執行下列程式碼,來建立輸入和輸出緩衝區:

setg(getptr,
    getptr,
    putptr);

setp(putptr,
    getptr + N);

在此情況下,putptr 必須在 interval [ getptrgetptr + 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 儲存在讀取位置中的元素,並前進輸入緩衝區的下一個指標。

另請參閱

streambuf
C++ 標準程式庫中的執行緒安全
iostream 程式設計
iostreams 慣例