strstreambuf — Klasa
Opisuje bufor strumienia, który kontroluje transmisję elementów do i z sekwencji elementów przechowywanych w obiekcie tablicy char
.
Składnia
class strstreambuf : public streambuf
Uwagi
W zależności od sposobu konstruowania obiektu można go przydzielić, rozszerzyć i zwolnić w razie potrzeby, aby uwzględnić zmiany w sekwencji.
Obiekt klasy strstreambuf
przechowuje kilka bitów informacji o trybie jako jego strstreambuf
tryb. Te bity wskazują, czy kontrolowana sekwencja:
Został przydzielony i musi zostać ostatecznie uwolniony.
Można modyfikować.
Można rozszerzyć przez reallokowanie magazynu.
Został zamrożony i dlatego musi być odroczony przed zniszczeniem obiektu lub uwolniony (jeśli przydzielono) przez agencję inną niż obiekt.
Nie można zmodyfikować ani rozszerzyć kontrolowanej sekwencji, niezależnie od stanu tych oddzielnych bitów trybu.
Obiekt przechowuje również wskaźniki do dwóch funkcji kontrolujących strstreambuf
alokację. Jeśli są to wskaźniki o wartości null, obiekt opracowuje własną metodę przydzielania i zwalniania magazynu dla kontrolowanej sekwencji.
Uwaga
Ta klasa jest przestarzała. Zamiast tego rozważ użycie ciągubuf lub wstringbuf .
Konstruktory
Konstruktor | opis |
---|---|
strstreambuf | Tworzy obiekt typu strstreambuf . |
Funkcje składowe
Funkcja składowa | opis |
---|---|
zamarzać | Powoduje niedostępności buforu strumienia za pośrednictwem operacji buforu strumienia. |
przepełnienie | Chroniona funkcja wirtualna, którą można wywołać, gdy nowy znak zostanie wstawiony do pełnego buforu. |
pbackfail | Chroniona funkcja wirtualnego elementu członkowskiego, która próbuje przywrócić element do strumienia wejściowego, a następnie ustawić go jako bieżący element (wskazywany przez następny wskaźnik). |
pcount | Zwraca liczbę elementów zapisanych w kontrolowanej sekwencji. |
seekoff | Chroniona funkcja wirtualna składowa, która próbuje zmienić bieżące pozycje dla kontrolowanych strumieni. |
seekpos | Chroniona funkcja wirtualna składowa, która próbuje zmienić bieżące pozycje dla kontrolowanych strumieni. |
Str | Wywołuje blokadę, a następnie zwraca wskaźnik na początek kontrolowanej sekwencji. |
Niedomiar | Chroniona funkcja wirtualna umożliwiająca wyodrębnienie bieżącego elementu ze strumienia wejściowego. |
Wymagania
Nagłówek:<strstream>
Przestrzeń nazw: std
strstreambuf::freeze
Powoduje niedostępności buforu strumienia za pośrednictwem operacji buforu strumienia.
void freeze(bool _Freezeit = true);
Parametry
_Freezeit
Wartość wskazująca bool
, czy strumień ma być zamrożony.
Uwagi
Jeśli _Freezeit ma wartość true, funkcja zmienia tryb przechowywania strstreambuf
, aby zatrzymać kontrolowaną sekwencję. W przeciwnym razie sprawia, że kontrolowana sekwencja nie jest zamrożona.
str oznacza freeze
.
Uwaga
Zamrożony bufor nie zostanie uwolniony podczas strstreambuf
zniszczenia. Aby uniknąć wycieku pamięci, należy odmrozić bufor.
Przykład
// 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
Chroniona funkcja wirtualna, którą można wywołać, gdy nowy znak zostanie wstawiony do pełnego buforu.
virtual int overflow(int _Meta = EOF);
Parametry
_Meta
Znak do wstawienia do buforu lub EOF
.
Wartość zwracana
Jeśli funkcja nie powiedzie się, zwraca wartość EOF
. W przeciwnym razie, jeśli _MetaEOF
== , zwraca pewną wartość inną niż .EOF
W przeciwnym razie zwraca _Meta.
Uwagi
Jeśli _Meta != EOF
, chroniona funkcja wirtualna elementu członkowskiego próbuje wstawić element (char)_Meta
do buforu wyjściowego. Może to zrobić na różne sposoby:
Jeśli pozycja zapisu jest dostępna, może przechowywać element w pozycji zapisu i zwiększać następny wskaźnik dla buforu wyjściowego.
Jeśli przechowywany tryb strstreambuf mówi, że kontrolowana sekwencja jest modyfikowalna, rozszerzalna, a nie zamrożona, funkcja może udostępnić pozycję zapisu, przydzielając nowe dla buforu wyjściowego. Rozszerzenie buforu wyjściowego w ten sposób powoduje również rozszerzenie dowolnego skojarzonego buforu wejściowego.
strstreambuf::p backfail
Chroniona funkcja wirtualna elementu członkowskiego, która próbuje przywrócić element do strumienia wejściowego, a następnie sprawia, że jest to bieżący element (wskazywany przez następny wskaźnik).
virtual int pbackfail(int _Meta = EOF);
Parametry
_Meta
Znak do wstawienia do buforu lub EOF
.
Wartość zwracana
Jeśli funkcja nie powiedzie się, zwraca wartość EOF
. W przeciwnym razie, jeśli _MetaEOF
== , zwraca pewną wartość inną niż .EOF
W przeciwnym razie zwraca _Meta.
Uwagi
Chroniona funkcja wirtualnego elementu członkowskiego próbuje przywrócić element do buforu wejściowego, a następnie ustawić go jako bieżący element (wskazywany przez następny wskaźnik).
Jeśli _Meta == EOF
, element do odepchnięcia jest skutecznie elementem, który znajduje się już w strumieniu przed bieżącym elementem. W przeciwnym razie ten element jest zastępowany przez ch = (char)_Meta
element . Funkcja może umieścić element na różne sposoby:
Jeśli jest dostępna pozycja sytuacyjna, a przechowywany tam element porównuje wartość równą
ch
, może on dekrementować następny wskaźnik dla buforu wejściowego.Jeśli jest dostępna pozycja sygnalizatora, a jeśli tryb strstreambuf mówi, że kontrolowana sekwencja jest modyfikowalna, funkcja może przechowywać
ch
w pozycji odłożonej i dekrementować następny wskaźnik dla buforu wejściowego.
strstreambuf::p count
Zwraca liczbę elementów zapisanych w kontrolowanej sekwencji.
streamsize pcount() const;
Wartość zwracana
Liczba elementów zapisanych w kontrolowanej sekwencji.
Uwagi
W szczególności, jeśli pptr jest wskaźnikiem null, funkcja zwraca zero. W przeciwnym razie zwraca pptr
- wartość pbase.
Przykład
// 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
Chroniona funkcja wirtualna składowa, która próbuje zmienić bieżące pozycje dla kontrolowanych strumieni.
virtual streampos seekoff(streamoff _Off,
ios_base::seekdir _Way,
ios_base::openmode _Which = ios_base::in | ios_base::out);
Parametry
_Od
Stanowisko do poszukiwania względem _Way.
_Droga
Punkt początkowy operacji przesunięcia. Zobacz wyszukiwanie możliwych wartości.
_Który
Określa tryb położenia wskaźnika. Ustawieniem domyślnym jest umożliwienie modyfikowania pozycji odczytu i zapisu.
Wartość zwracana
Jeśli funkcja zakończy się powodzeniem w zmianie albo obu pozycji strumienia, zwraca wynikową pozycję strumienia. W przeciwnym razie kończy się niepowodzeniem i zwraca nieprawidłową pozycję strumienia.
Uwagi
Chroniona funkcja wirtualna elementu członkowskiego podejmuje działania w celu zmiany bieżących pozycji dla kontrolowanych strumieni. W przypadku obiektu klasy strstreambuf położenie strumienia składa się wyłącznie z przesunięcia strumienia. Przesunięcie zero wyznacza pierwszy element kontrolowanej sekwencji.
Nowe stanowisko jest określane w następujący sposób:
Jeśli
_Way == ios_base::beg
nowa pozycja to początek strumienia i _Off.Jeśli
_Way == ios_base::cur
, nowe położenie jest bieżącym położeniem strumienia i _Off.Jeśli
_Way == ios_base::end
wartość , nowa pozycja to koniec strumienia oraz _Off.
Jeśli _Which & ios_base::in
element jest niezerowy, a bufor wejściowy istnieje, funkcja zmienia kolejną pozycję, aby odczytać w buforze wejściowym. Jeśli _Which & ios_base::out
jest również niezerowy, _Way != ios_base::cur
, a bufor wyjściowy istnieje, funkcja ustawia również następne położenie do zapisu, aby dopasować następną pozycję do odczytu.
W przeciwnym razie, jeśli _Which & ios_base::out
nie jestzero, a bufor wyjściowy istnieje, funkcja zmienia następne położenie, aby zapisać w buforze wyjściowym. W przeciwnym razie operacja pozycjonowania kończy się niepowodzeniem. Aby operacja pozycjonowania powiodła się, wynikowa pozycja strumienia musi znajdować się w kontrolowanej sekwencji.
strstreambuf::seekpos
Chroniona funkcja wirtualna składowa, która próbuje zmienić bieżące pozycje dla kontrolowanych strumieni.
virtual streampos seekpos(streampos _Sp, ios_base::openmode _Which = ios_base::in | ios_base::out);
Parametry
_Sp
Stanowisko do poszukiwania.
_Który
Określa tryb położenia wskaźnika. Ustawieniem domyślnym jest umożliwienie modyfikowania pozycji odczytu i zapisu.
Wartość zwracana
Jeśli funkcja zakończy się powodzeniem w zmianie albo obu pozycji strumienia, zwraca wynikową pozycję strumienia. W przeciwnym razie kończy się niepowodzeniem i zwraca nieprawidłową pozycję strumienia. Aby określić, czy pozycja strumienia jest nieprawidłowa, porównaj wartość zwracaną z pos_type(off_type(-1))
.
Uwagi
Chroniona funkcja wirtualna elementu członkowskiego podejmuje działania w celu zmiany bieżących pozycji dla kontrolowanych strumieni. W przypadku obiektu klasy strstreambuf położenie strumienia składa się wyłącznie z przesunięcia strumienia. Przesunięcie zero wyznacza pierwszy element kontrolowanej sekwencji. Nowe stanowisko jest określane przez _Sp.
Jeśli _Which
element & ios_base::in nie jestzerowy, a bufor wejściowy istnieje, funkcja zmienia kolejną pozycję, aby odczytać w buforze wejściowym. Jeśli _Which
element & ios_base::out
nie jestzerowy, a bufor wyjściowy istnieje, funkcja ustawia również następną pozycję zapisu, aby dopasować następną pozycję do odczytu. W przeciwnym razie, jeśli _Which
element & ios_base::out
nie jestzerowy, a bufor wyjściowy istnieje, funkcja zmienia kolejną pozycję, aby zapisać w buforze wyjściowym. W przeciwnym razie operacja pozycjonowania kończy się niepowodzeniem. Aby operacja pozycjonowania powiodła się, wynikowa pozycja strumienia musi znajdować się w kontrolowanej sekwencji.
strstreambuf::str
Wywołuje blokadę, a następnie zwraca wskaźnik na początek kontrolowanej sekwencji.
char *str();
Wartość zwracana
Wskaźnik na początek kontrolowanej sekwencji.
Uwagi
Nie istnieje żaden element o wartości null, chyba że jawnie wstawisz go.
Przykład
Zobacz strstreambuf::freeze , aby zapoznać się z przykładem, który używa parametru str.
strstreambuf::strstreambuf
Tworzy obiekt 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
Funkcja używana do przydzielania pamięci buforu.
count
Określa długość buforu wskazywanego przez getptr. Jeśli getptr nie jest argumentem (formularz pierwszego konstruktora), sugerowany rozmiar alokacji dla.
_Freefunc
Funkcja używana do zwalniania pamięci buforu.
getptr
Bufor używany do wprowadzania danych wejściowych.
putptr
Bufor używany na potrzeby danych wyjściowych.
Uwagi
Pierwszy konstruktor przechowuje wskaźnik o wartości null we wszystkich wskaźnikach kontrolujących bufor wejściowy, bufor wyjściowy i alokację strstreambuf. Ustawia on tryb przechowywanego strstreambuf, aby można było modyfikować i rozszerzać kontrolowaną sekwencję. Akceptuje również liczbę sugerowanego początkowego rozmiaru alokacji.
Drugi konstruktor zachowuje się jak pierwszy, z tą różnicą, że przechowuje alloc_func jako wskaźnik do funkcji w celu wywołania w celu przydzielenia magazynu i free_func jako wskaźnika do funkcji w celu wywołania w celu zwolnienia tego magazynu.
Trzy 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);
Zachowuje się również jak pierwszy, z tą różnicą, że getptr wyznacza obiekt tablicy używany do przechowywania kontrolowanej sekwencji. (W związku z tym nie może to być wskaźnik o wartości null). Liczba elementów N w tablicy jest określana w następujący sposób:
Jeśli (liczba> 0), N to liczba.
Jeśli (count == 0), n to
strlen((const char *) getptr )
.Jeśli (liczba< 0), N jest INT_MAX.
Jeśli putptr jest wskaźnikiem o wartości null, funkcja ustanawia tylko bufor wejściowy, wykonując następujące czynności:
setg(getptr,
getptr,
getptr + N);
W przeciwnym razie ustanawia zarówno wejściowe, jak i wyjściowe, wykonując następujące czynności:
setg(getptr,
getptr,
putptr);
setp(putptr,
getptr + N);
W takim przypadku element putptr musi znajdować się w interwale [getptr, getptr + N].
Na koniec trzy konstruktory:
strstreambuf(const char *getptr,
streamsize count);
strstreambuf(const signed char *getptr,
streamsize count);
strstreambuf(const unsigned char *getptr,
streamsize count);
wszystkie zachowują się tak samo jak:
streambuf((char *)getptr, count);
z wyjątkiem tego, że tryb przechowywany sprawia, że kontrolowana sekwencja nie może ani być modyfikowalna, ani rozszerzalna.
strstreambuf::underflow
Chroniona funkcja wirtualna umożliwiająca wyodrębnienie bieżącego elementu ze strumienia wejściowego.
virtual int underflow();
Wartość zwracana
Jeśli funkcja nie powiedzie się, zwraca wartość EOF
. W przeciwnym razie zwraca bieżący element w strumieniu wejściowym, przekonwertowany zgodnie z powyższym opisem.
Uwagi
Chroniona funkcja wirtualna elementu członkowskiego podejmuje działania w celu wyodrębnienia bieżącego elementu ch
z buforu wejściowego, a następnie przesunie bieżące położenie strumienia i zwróci element jako (int)(unsigned char)ch
. Może to zrobić tylko w jeden sposób: jeśli pozycja odczytu jest dostępna, przyjmuje ch
jako element przechowywany w pozycji odczytu i przechodzi następny wskaźnik dla buforu wejściowego.
Zobacz też
streambuf
Bezpieczeństwo wątku w standardowej bibliotece C++
iostream, programowanie
Konwencje iostream