Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Popisuje vyrovnávací paměť datového proudu, která řídí přenos prvků do a z posloupnosti prvků uložených v objektu char pole.
Syntaxe
class strstreambuf : public streambuf
Poznámky
V závislosti na tom, jak je objekt vytvořen, může být přidělen, rozšířen a uvolněn podle potřeby tak, aby vyhovoval změnám v sekvenci.
Objekt třídy strstreambuf ukládá jako svůj strstreambuf režim několik bitů informací o režimu. Tyto bity označují, jestli je řízená sekvence:
Byl přidělen a musí být uvolněn nakonec.
Je upravitelný.
Rozšíření se dá rozšířit přidělením úložiště.
Byl zmrazen, a proto musí být před zničením objektu zrušen nebo uvolněn (pokud je přidělen) agenturou jinou než objekt.
Řízenou sekvenci, která je zablokovaná, nelze změnit ani rozšířit bez ohledu na stav těchto samostatných bitů režimu.
Objekt také ukládá ukazatele na dvě funkce, které řídí strstreambuf přidělení. Pokud se jedná o ukazatele null, objekt navrhne vlastní metodu přidělování a uvolnění úložiště pro řízenou sekvenci.
Poznámka:
Tato třída je zastaralá. Zvažte místo toho použití stringbuf nebo wstringbuf .
Konstruktory
| Konstruktor | Popis |
|---|---|
| strstreambuf | Vytvoří objekt typu strstreambuf. |
Členské funkce
| Členová funkce | Popis |
|---|---|
| mrznout | Způsobí nedostupnost vyrovnávací paměti datového proudu prostřednictvím operací vyrovnávací paměti datového proudu. |
| přetečení | Chráněná virtuální funkce, kterou lze volat při vložení nového znaku do plné vyrovnávací paměti. |
| pbackfail | Chráněná virtuální členová funkce, která se pokusí vložit prvek zpět do vstupního datového proudu, a pak ho nastavit jako aktuální prvek (na který odkazuje další ukazatel). |
| pcount | Vrátí počet prvků zapsaných do řízené sekvence. |
| hledání | Chráněná virtuální členová funkce, která se pokouší změnit aktuální pozice pro řízené datové proudy. |
| hledání | Chráněná virtuální členová funkce, která se pokouší změnit aktuální pozice pro řízené datové proudy. |
| Str | Volání ukotvit a poté vrátí ukazatel na začátek řízené sekvence. |
| podtečení | Chráněná virtuální funkce pro extrahování aktuálního prvku ze vstupního datového proudu. |
Požadavky
Header:<strstream>
Obor názvů: std
strstreambuf::freeze
Způsobí nedostupnost vyrovnávací paměti datového proudu prostřednictvím operací vyrovnávací paměti datového proudu.
void freeze(bool _Freezeit = true);
Parametry
_Freezeit
Označuje bool , jestli chcete, aby byl datový proud ukotvený.
Poznámky
Pokud je _Freezeit pravdivý, funkce změní uložený strstreambuf režim tak, aby se kontrolovaná sekvence zmrazovala. V opačném případě zmrazuje řízenou sekvenci.
str implikuje freeze.
Poznámka:
Během zničení se neuvolní strstreambuf zmrazená vyrovnávací paměť. Před uvolněním vyrovnávací paměti je nutné uvolnit vyrovnávací paměť, aby nedošlo k nevrácení paměti.
Příklad
// 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
Chráněná virtuální funkce, kterou lze volat při vložení nového znaku do plné vyrovnávací paměti.
virtual int overflow(int _Meta = EOF);
Parametry
_Meta
Znak, který se má vložit do vyrovnávací paměti, nebo EOF.
Návratová hodnota
Pokud funkce nemůže být úspěšná, vrátí EOFhodnotu . V opačném případě, pokud _MetaEOF == , vrátí jinou hodnotu než .EOF V opačném případě vrátí _Meta.
Poznámky
Pokud _Meta != EOF, chráněná virtuální členová funkce se pokusí vložit prvek (char)_Meta do výstupní vyrovnávací paměti. Může to udělat různými způsoby:
Pokud je k dispozici pozice zápisu, může prvek uložit do pozice zápisu a zvýšit další ukazatel pro výstupní vyrovnávací paměť.
Pokud uložený režim strstreambuf říká, že řízená sekvence je upravitelná, rozšiřitelná a nezablokovaná, může funkce zpřístupnit pozici zápisu přidělením nové pro výstupní vyrovnávací paměť. Rozšíření výstupní vyrovnávací paměti tímto způsobem také rozšiřuje veškerou přidruženou vstupní vyrovnávací paměť.
strstreambuf::p backfail
Chráněná virtuální členová funkce, která se pokusí vložit prvek zpět do vstupního datového proudu, a pak z něj vytvoří aktuální prvek (na který odkazuje další ukazatel).
virtual int pbackfail(int _Meta = EOF);
Parametry
_Meta
Znak, který se má vložit do vyrovnávací paměti, nebo EOF.
Návratová hodnota
Pokud funkce nemůže být úspěšná, vrátí EOFhodnotu . V opačném případě, pokud _MetaEOF == , vrátí jinou hodnotu než .EOF V opačném případě vrátí _Meta.
Poznámky
Chráněná virtuální členová funkce se pokusí vrátit prvek do vstupní vyrovnávací paměti a pak ho nastavit jako aktuální prvek (na který odkazuje další ukazatel).
Pokud _Meta == EOF, prvek, který se má vrátit zpět, je skutečně ten, který již v datovém proudu před aktuálním prvkem. V opačném případě se tento prvek nahradí znakem ch = (char)_Meta. Funkce může vrátit prvek různými způsoby:
Pokud je k dispozici pozice putbacku a prvek uložený tam porovnává rovná
chse , může dekrementovat další ukazatel pro vstupní vyrovnávací paměť.Pokud je k dispozici pozice putbacku a pokud režim strstreambuf říká, že řízená sekvence je upravitelná, může se funkce uložit
chdo pozice putback a dekrementovat další ukazatel pro vstupní vyrovnávací paměť.
strstreambuf::p count
Vrátí počet prvků zapsaných do řízené sekvence.
streamsize pcount() const;
Návratová hodnota
Počet prvků zapsaných do řízené sekvence.
Poznámky
Konkrétně pokud pptr je ukazatel null, funkce vrátí nulu. V opačném případě vrátí pptr - pbase.
Příklad
// 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
Chráněná virtuální členová funkce, která se pokouší změnit aktuální pozice pro řízené datové proudy.
virtual streampos seekoff(streamoff _Off,
ios_base::seekdir _Way,
ios_base::openmode _Which = ios_base::in | ios_base::out);
Parametry
_Pryč
Pozice, která se má hledat vzhledem k _Way.
_Cesta
Výchozí bod pro operace posunu. Informace o možných hodnotách najdete v nástroji seekdir .
_Který
Určuje režim pozice ukazatele. Výchozí nastavení je umožnit úpravu pozic čtení a zápisu.
Návratová hodnota
Pokud se funkce úspěšně změní buď nebo obě pozice datového proudu, vrátí výslednou pozici datového proudu. V opačném případě selže a vrátí neplatnou pozici datového proudu.
Poznámky
Chráněná virtuální členová funkce se snaží změnit aktuální pozice pro řízené datové proudy. Pro objekt třídy strstreambuf se pozice datového proudu skládá čistě z posunu datového proudu. Odsazení nuly označuje první prvek řízené sekvence.
Nové umístění je určeno takto:
Pokud
_Way == ios_base::begje nová pozice začátek datového proudu plus _Off.Pokud
_Way == ios_base::curje nová pozice aktuální pozice datového proudu plus _Off.Pokud
_Way == ios_base::end, nová pozice je konec datového proudu plus _Off.
Pokud _Which & ios_base::in je nenulová a vstupní vyrovnávací paměť existuje, funkce změní další pozici pro čtení ve vstupní vyrovnávací paměti. Pokud _Which & ios_base::out je také nenulová a _Way != ios_base::curvýstupní vyrovnávací paměť existuje, funkce také nastaví další pozici zápisu tak, aby odpovídala další pozici ke čtení.
Jinak pokud _Which & ios_base::out je nenulová a výstupní vyrovnávací paměť existuje, funkce změní další pozici pro zápis do výstupní vyrovnávací paměti. Jinak operace umístění selže. Aby operace umístění byla úspěšná, musí výsledná pozice datového proudu být umístěná v řízené sekvenci.
strstreambuf::seekpos
Chráněná virtuální členová funkce, která se pokouší změnit aktuální pozice pro řízené datové proudy.
virtual streampos seekpos(streampos _Sp, ios_base::openmode _Which = ios_base::in | ios_base::out);
Parametry
_Sp
Pozice, na které se má hledat.
_Který
Určuje režim pozice ukazatele. Výchozí nastavení je umožnit úpravu pozic čtení a zápisu.
Návratová hodnota
Pokud se funkce úspěšně změní buď nebo obě pozice datového proudu, vrátí výslednou pozici datového proudu. V opačném případě selže a vrátí neplatnou pozici datového proudu. Chcete-li zjistit, zda je pozice datového proudu neplatná, porovnejte návratovou hodnotu s pos_type(off_type(-1)).
Poznámky
Chráněná virtuální členová funkce se snaží změnit aktuální pozice pro řízené datové proudy. Pro objekt třídy strstreambuf se pozice datového proudu skládá čistě z posunu datového proudu. Odsazení nuly označuje první prvek řízené sekvence. Nová pozice je určena _Sp.
Pokud _Which & ios_base::in je nenulová a vstupní vyrovnávací paměť existuje, změní funkce další pozici pro čtení ve vstupní vyrovnávací paměti. Pokud _Which je nenulová ios_base::out a výstupní vyrovnávací paměť existuje, nastaví funkce také další pozici zápisu tak, aby odpovídala další pozici ke čtení. Jinak platí, že pokud _Which je nenulová ios_base::out a výstupní vyrovnávací paměť existuje, změní funkce další pozici pro zápis do výstupní vyrovnávací paměti. Jinak operace umístění selže. Aby operace umístění byla úspěšná, musí výsledná pozice datového proudu být umístěná v řízené sekvenci.
strstreambuf::str
Volání ukotvit a poté vrátí ukazatel na začátek řízené sekvence.
char *str();
Návratová hodnota
Ukazatel na začátek řízené sekvence.
Poznámky
Neexistuje žádný ukončující prvek null, pokud ho explicitně nevložíte.
Příklad
Viz strstreambuf::freeze pro ukázku, která používá str.
strstreambuf::strstreambuf
Vytvoří objekt typu 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);
Parametry
alloc_func
Funkce použitá k přidělení paměti vyrovnávací paměti.
count
Určuje délku vyrovnávací paměti, na kterou odkazuje getptr. Pokud getptr není argument (první formulář konstruktoru), navrhovaná velikost přidělení pro vyrovnávací paměti.
_Freefunc
Funkce používaná k uvolnění paměti vyrovnávací paměti.
getptr
Vyrovnávací paměť použitá pro vstup.
putptr
Vyrovnávací paměť použitá pro výstup.
Poznámky
První konstruktor ukládá ukazatel null ve všech ukazatelích, které řídí vstupní vyrovnávací paměť, výstupní vyrovnávací paměť a přidělení strstreambuf. Nastaví uložený režim strstreambuf, aby se kontrolovaná sekvence modifikovala a rozšiřovala. Přijímá také počet jako navrženou počáteční velikost přidělení.
Druhý konstruktor se chová jako první, s tím rozdílem, že ukládá alloc_func jako ukazatel na funkci pro volání přidělení úložiště a free_func jako ukazatel na funkci pro volání do volného úložiště.
Tři konstruktory:
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);
chová se také jako první, s tím rozdílem, že getptr určuje maticový objekt použitý k uložení řízené sekvence. (Proto nesmí být ukazatelem null.) Počet prvků N v poli je určen takto:
Pokud (počet> 0), pak je počet N.
Pokud (počet == 0), pak N je
strlen((const char *) getptr ).Pokud (počet< 0), pak N je INT_MAX.
Pokud je putptr nulový ukazatel, funkce vytvoří pouze vstupní vyrovnávací paměť spuštěním:
setg(getptr,
getptr,
getptr + N);
V opačném případě vytvoří vstupní i výstupní vyrovnávací paměť spuštěním:
setg(getptr,
getptr,
putptr);
setp(putptr,
getptr + N);
V tomto případě musí být putptr v intervalu [ getptr, getptr + N].
Nakonec tři konstruktory:
strstreambuf(const char *getptr,
streamsize count);
strstreambuf(const signed char *getptr,
streamsize count);
strstreambuf(const unsigned char *getptr,
streamsize count);
všechny se chovají stejně jako:
streambuf((char *)getptr, count);
kromě toho, že uložený režim umožňuje řízenou sekvenci měnit ani rozšířit.
strstreambuf::underflow
Chráněná virtuální funkce pro extrahování aktuálního prvku ze vstupního datového proudu.
virtual int underflow();
Návratová hodnota
Pokud funkce nemůže být úspěšná, vrátí EOFhodnotu . V opačném případě vrátí aktuální prvek ve vstupním datovém proudu převedený, jak je popsáno výše.
Poznámky
Chráněná virtuální členová funkce se snaží extrahovat aktuální prvek ch ze vstupní vyrovnávací paměti, pak přejít na aktuální pozici datového proudu a vrátit prvek jako (int)(unsigned char)ch. To může provést pouze jedním způsobem: pokud je k dispozici pozice čtení, přebírá ch jako prvek uložený v pozici čtení a postupuje dalším ukazatelem vstupní vyrovnávací paměti.
Viz také
streambuf
Bezpečný přístup z více vláken ve standardní knihovně C++
iostream – programování
iostreams – konvence