建議使用 Visual Studio 2017

strstreambuf 類別

 

如需 Visual Studio 2017 的最新文件請參閱 Visual Studio 2017 文件

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

class strstreambuf : public streambuf  

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

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

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

  • 可修改。

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

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

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

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

System_CAPS_ICON_note.jpg 注意

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

建構函式

strstreambuf建構類型 strstreambuf 的物件。

成員函式

凍結導致資料流緩衝區無法在資料流緩衝區作業中使用。
溢位受保護的虛擬函式,可在將新字元插入已滿的緩衝區時呼叫。
pbackfail嘗試將項目放回輸入資料流,然後將其設為目前項目 (由下一個指標指向) 的受保護虛擬成員函式。
pcount傳回寫入至受控制序列的元素計數。
seekoff受保護虛擬成員函式嘗試改變受控制資料流目前的位置。
seekpos受保護虛擬成員函式嘗試改變受控制資料流目前的位置。
str呼叫凍結,然後傳回受控制序列的開頭的指標。
反向溢位要從輸入資料流擷取目前項目的受保護虛擬函式。

標頭︰<>>

命名空間: std

導致資料流緩衝區無法在資料流緩衝區作業中使用。

void freeze(bool _Freezeit = true);

參數

_Freezeit
Abool指出您是否想要凍結的資料流。

備註

如果_Freezeit為 true,預存函式會改變strstreambuf来凍結的受控制的序列的模式。 否則,它可讓受控制的序列不會凍結。

str意味著freeze

System_CAPS_ICON_note.jpg 注意

凍結的緩衝區不會釋放期間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  

受保護的虛擬函式,可在將新字元插入已滿的緩衝區時呼叫。

virtual int overflow(int _Meta = EOF);

參數

_Meta
要插入到緩衝區的字元或EOF

傳回值

如果無法成功函式,它會傳回EOF。 否則,如果 _中繼 == EOF,它會傳回某個值以外的其他EOF。 否則,它會傳回_中繼

備註

如果 _中繼! = EOF,受保護的虛擬成員函式會嘗試插入項目 ( char)_ 中繼至輸出緩衝區。 它可以各種方式來這麼做︰

  • 寫入位置是否可用,可儲存的寫入位置的項目,並增加輸出緩衝區的下一個指標。

  • 如果預存的 strstreambuf 模式是 [受控制的序列是可修改、 可擴充的與未凍結,函式可寫入位置提供新配置輸出緩衝區。 這種方式擴充輸出緩衝區時,也會擴充任何相關聯的輸入的緩衝區。

受保護的虛擬成員函式,嘗試將訊息放回元素的輸入資料流,並使它目前的項目 (指向下一個指標)。

virtual int pbackfail(int _Meta = EOF);

參數

_Meta
要插入到緩衝區的字元或EOF

傳回值

如果無法成功函式,它會傳回EOF。 否則,如果 _中繼 == EOF,它會傳回某個值以外的其他EOF。 否則,它會傳回_中繼

備註

受保護的虛擬成員函式會嘗試以放回元素輸入緩衝區中,然後在它目前的項目 (指向下一個指標)。

如果 _中繼 == EOF,要推的項目實際上是一個已經在資料流中目前的項目之前。 否則,該元素會取代ch = ( char)_ 中繼。 函式可以放回元素以各種方式︰

  • 如果有 putback 位置,而且那里儲存的項目等於ch,它可以減少輸入緩衝區的下一個指標。

  • 如果有 putback 位置,而且如果 strstreambuf 模式是 [受控制的序列進行修改,可以儲存函式ch putback 位置和遞減的輸入緩衝區的下一個指標。

傳回寫入至受控制序列的元素計數。

streamsize pcount() const;

傳回值

寫入至受控制序列的元素數目的計數。

備註

具體來說,如果pptr是 null 指標,此函數會傳回零。 否則,它會傳回pptrpbase

範例

// 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;  
}  

受保護虛擬成員函式嘗試改變受控制資料流目前的位置。

virtual streampos seekoff(streamoff _Off,
    ios_base::seekdir _Way,
    ios_base::openmode _Which = ios_base::in | ios_base::out);

參數

_Off
要搜尋的相對位置_Way

_Way
位移作業的起點。 請參閱seekdir提供可能的值。

_Which
指定指標的位置模式。 預設值是可讓您修改讀取和寫入的位置。

傳回值

如果函式中改變成功或同時傳送資料流的位置,它會傳回結果資料流位置。 否則,它就會失敗,傳回無效的資料流位置。

備註

受保護的虛擬成員函式的大型工作更改受控制的資料流的目前位置。 Strstreambuf 類別的物件,資料流位置只包含資料流位移。 零位移指定受控制序列的第一個項目。

新的位置決定,如下所示︰

  • 如果_Way == ios_base::beg,新的位置是開頭的資料流以及 _關閉

  • 如果_Way == ios_base::cur,新的位置是目前資料流位置再加上 _關閉

  • 如果_Way == ios_base::end,新的位置是結束資料流,加上 _關閉

如果_Which & ios_base::in為非零值而存在的輸入的緩衝區時,函式會變更讀取輸入緩衝區中的下一個位置。 如果_Which & ios_base::out也是零, _Way ! = ios_base::cur,且輸出緩衝區存在,函式也會將設定寫入符合要讀取的下一個位置的下一個位置。

否則,如果_Which & ios_base::out為非零值,且輸出緩衝區存在函式會變更要寫入輸出緩衝區中的下一個位置。 否則,定位作業會失敗。 定位作業成功,請產生的資料流位置必須位於受控制序列。

受保護虛擬成員函式嘗試改變受控制資料流目前的位置。

virtual streampos seekpos(streampos _Sp, ios_base::openmode _Which = ios_base::in | ios_base::out);

參數

_Sp
要搜尋的位置。

_Which
指定指標的位置模式。 預設值是可讓您修改讀取和寫入的位置。

傳回值

如果函式中改變成功或同時傳送資料流的位置,它會傳回結果資料流位置。 否則,它就會失敗,傳回無效的資料流位置。 若要判斷資料流位置是否正確,比較傳回的值與pos_type(off_type(-1))

備註

受保護的虛擬成員函式的大型工作更改受控制的資料流的目前位置。 Strstreambuf 類別的物件,資料流位置只包含資料流位移。 零位移指定受控制序列的第一個項目。 新的位置取決於 _ Sp

如果_Which & ios_base::in為非零值,且輸入的緩衝區存在函式會變更讀取輸入緩衝區中的下一個位置。 如果_Which & ios_base::out為非零值,且輸出緩衝區存在函式也會將設定寫入符合要讀取的下一個位置的下一個位置。 否則,如果_Which & ios_base::out為非零值,且輸出緩衝區存在函式會變更要寫入輸出緩衝區中的下一個位置。 否則,定位作業會失敗。 定位作業成功,請產生的資料流位置必須位於受控制序列。

呼叫凍結,然後傳回受控制序列的開頭的指標。

char *str();

傳回值

受控制序列的開頭指標。

備註

沒有結束的 null 項目存在,除非您明確地插入。

範例

請參閱strstreambuf:: freeze如需使用範例str

建構類型 strstreambuf 的物件。

explicit strstreambuf(streamsize count = 0);

strstreambuf(void (* _Allocfunc)(size_t),
    void (* _Freefunc)(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);

參數

_Allocfunc
用於配置的記憶體緩衝區的函式。

count
判斷所指向的緩衝區長度_Getptr。 如果_Getptr不是引數 (第一個建構函式形式),建議的配置大小的緩衝區。

_Freefunc
用來釋放記憶體緩衝區的函式。

_Getptr
用於輸入緩衝區。

_Putptr
用於輸出緩衝區。

備註

第一個建構函式中控制輸入的緩衝區、 輸出緩衝區和 strstreambuf 配置的所有指標存放 null 指標。 它將預存的 strstreambuf 模式設定為可修改和延伸,讓受控制的序列。 它也可接受count做為建議的初始配置大小。

第二個建構函式的行為類似第一,但它會儲存 _ Allocfunc配置存放區呼叫的函式的指標和_ Freefunc釋放該儲存體所呼叫的函式的指標。

三個建構函式︰

 
    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陣列中決定,如下所示︰

  • If ( count > 0), then N is count.

  • If (`` count == 0), then N is strlen( ( constchar *) _Getptr ).

  • If ( count < 0),="" then="">N is INT_MAX.

如果_Putptr是 null 指標,函式會建立只輸入的緩衝區執行︰

setg(_Getptr,
    _Getptr,
    _Getptr + N);

否則,它會建立輸入和輸出緩衝區執行︰

setg(_Getptr,
    _Getptr,
    _Putptr);

setp(_Putptr,
    _Getptr + N);

在此情況下,_Putptr間隔必須是 [ _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);

除非預存的模式,可修改或延伸都不會受控制的序列。

要從輸入資料流擷取目前項目的受保護虛擬函式。

virtual int underflow();

傳回值

如果無法成功函式,它會傳回EOF。 否則,會傳回目前的項目中輸入的資料流,轉換 (如上所述)。

備註

受保護的虛擬成員函式的大型工作來擷取目前的項目ch輸入緩衝區,然後進入目前資料流的位置,並傳回項目做為 ( int) ( unsigned``char) ch。 它可以在只有一種方式進行︰ 讀取的位置是否可用,它會採用ch因為項目儲存在讀取的位置,讓前進的輸入緩衝區的下一個指標。

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

顯示: