strstreambuf-Klasse
Beschreibt einen Streampuffer, der die Übertragung von Elementen in eine bzw. aus einer Sequenz von Elementen steuert, die in einem char
-Arrayobjekt gespeichert sind.
Syntax
class strstreambuf : public streambuf
Hinweise
Je nachdem, wie das Objekt aufgebaut ist, kann es nach Bedarf reserviert, erweitert und freigegeben werden, um Änderungen in der Sequenz zu berücksichtigen.
Ein aus der Klasse strstreambuf
abgeleitetes Objekt speichert mehrere Bits mit Modusinformationen als seinen strstreambuf
-Modus. Diese Bits geben an, ob Folgendes für die gesteuerte Sequenz zutrifft:
Sie wurde reserviert und muss schließlich freigegeben werden.
Sie kann geändert werden.
Sie kann durch erneute Reservierung von Speicher erweitert werden.
Sie wurde eingefroren und muss daher „aufgetaut“ werden, bevor das Objekt zerstört wird, oder sie muss (sofern reserviert) durch ein Element freigegeben werden, das nicht mit dem Objekt identisch ist.
Eine gesteuerte Sequenz, die eingefroren ist, kann weder geändert noch erweitert werden, unabhängig vom Status dieser einzelnen Modusbits.
Das Objekt speichert auch Zeiger auf zwei Funktionen, mit denen die strstreambuf
-Speicherbelegung gesteuert wird. Sind diese Zeiger NULL-Zeiger, muss für das Objekt eine eigene Methode des Belegens und Freigebens von Speicher für die gesteuerte Sequenz formuliert sein.
Hinweis
Diese Klasse ist veraltet. Verwenden Sie stattdessen stringbuf oder wstringbuf.
Konstruktoren
Konstruktor | Beschreibung |
---|---|
strstreambuf | Konstruiert ein Objekt vom Typ strstreambuf . |
Memberfunktionen
Memberfunktion | Beschreibung |
---|---|
freeze | Bewirkt, dass ein Streampuffer durch Streampuffervorgänge nicht verfügbar ist. |
overflow | Eine geschützte virtuelle Funktion, die aufgerufen werden kann, wenn ein neues Zeichen in einen vollen Puffer eingefügt wird. |
pbackfail | Eine geschützte virtuelle Memberfunktion, die versucht, ein Element in den Eingabestreams zurückzuschreiben, und es dann zum aktuellen Element macht (auf das der nächste Zeiger zeigt). |
pcount | Gibt die Anzahl der Elemente zurück, die in die kontrollierte Sequenz geschrieben wurde. |
seekoff | Eine geschützte virtuelle Memberfunktion, die versucht, die aktuellen Positionen für die gesteuerten Streams zu ändern. |
seekpos | Eine geschützte virtuelle Memberfunktion, die versucht, die aktuellen Positionen für die gesteuerten Streams zu ändern. |
str | Ruft freeze auf gibt dann einen Zeiger am Anfang der kontrollierten Sequenz zurück. |
underflow | Eine geschützte virtuelle Funktion zum Extrahieren des aktuellen Elements aus dem Eingabestream. |
Anforderungen
Header:<strstream>
Namespace: std
strstreambuf::freeze
Bewirkt, dass ein Streampuffer durch Streampuffervorgänge nicht verfügbar ist.
void freeze(bool _Freezeit = true);
Parameter
_Freezeit
Ein bool
, der angibt, ob der Stream fixiert werden soll.
Hinweise
Wenn _Freezeit "true" ist, ändert die Funktion den gespeicherten strstreambuf
Modus, damit die kontrollierte Sequenz fixiert wird. Andernfalls ist es die kontrollierte Sequenz nicht fixiert.
str impliziert freeze
.
Hinweis
Ein fixierter Puffer wird während der strstreambuf
-Zerstörung nicht freigegeben. Sie müssen die Fixierung des Puffers aufheben, bevor er freigegeben wird, um einen Speicherverlust zu vermeiden.
Beispiel
// 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
Eine geschützte virtuelle Funktion, die aufgerufen werden kann, wenn ein neues Zeichen in einen vollen Puffer eingefügt wird.
virtual int overflow(int _Meta = EOF);
Parameter
_Meta
Das Zeichen, das in den Puffer eingefügt werden soll, oder EOF
.
Rückgabewert
Wenn die Funktion nicht erfolgreich abgeschlossen werden kann, wird EOF
zurückgegeben. Andernfalls gibt sie, wenn _MetaEOF
== , einen anderen Wert als .EOF
Andernfalls wird _Meta zurückgegeben.
Hinweise
Wenn _Meta != EOF
, versucht die geschützte virtuelle Memberfunktion, das Element (char)_Meta
in den Ausgabepuffer einzufügen. Hierfür gibt es verschiedene Möglichkeiten:
Wenn eine Schreibposition verfügbar ist, kann das Element in der Schreibposition gespeichert werden, und der nächste Zeiger für den Ausgabepuffer kann inkrementiert werden.
Wenn der gespeicherte strstreambuf Modus anzeigt, dass die kontrollierte Sequenz änderbar, erweiterbar und nicht fixiert ist, kann die Funktion eine Schreibposition verfügbar machen, indem für den Ausgabepuffer eine neue zugewiesen wird. Das Erweitern des Ausgabepuffers erweitert auf diese Weise auch alle zugewiesenen Eingabepuffer.
strstreambuf::p backfail
Eine geschützte virtuelle Memberfunktion, die versucht, ein Element in den Eingabestreams zurückzuschreiben, und es dann zum aktuellen Element macht (auf das der nächste Zeiger zeigt).
virtual int pbackfail(int _Meta = EOF);
Parameter
_Meta
Das Zeichen, das in den Puffer eingefügt werden soll, oder EOF
.
Rückgabewert
Wenn die Funktion nicht erfolgreich abgeschlossen werden kann, wird EOF
zurückgegeben. Andernfalls gibt sie, wenn _MetaEOF
== , einen anderen Wert als .EOF
Andernfalls wird _Meta zurückgegeben.
Hinweise
Die geschützte virtuelle Memberfunktion versucht, ein Element im Eingabepuffer wiederherzustellen und es dann zum aktuellen Element zu machen (der nächste Zeiger zeigt auf das Element).
Wenn _Meta == EOF
, ist das element, das zurückgesetzt werden soll, effektiv das Element, das sich bereits im Datenstrom befindet, vor dem aktuellen Element. Andernfalls wird dieses Element durch ch = (char)_Meta
. Ein Element kann auf verschiedene Arten durch die Funktion wiederhergestellt werden:
Wenn eine Putbackposition verfügbar ist und das dort gespeicherte Element gleich
ch
gleich ist, kann er den nächsten Zeiger für den Eingabepuffer verringern.Wenn eine Putbackposition verfügbar ist und der strstreambuf-Modus besagt, dass die kontrollierte Sequenz geändert werden kann, kann die Funktion in der Putbackposition speichern
ch
und den nächsten Zeiger für den Eingabepuffer erhöhen.
strstreambuf::p count
Gibt die Anzahl der Elemente zurück, die in die kontrollierte Sequenz geschrieben wurde.
streamsize pcount() const;
Rückgabewert
Ein Zähler der Anzahl von Elementen, die in die kontrollierte Sequenz geschrieben wurden.
Hinweise
Wenn pptr ein NULL-Zeiger ist, gibt die Funktion null zurück. Andernfalls wird pbase zurückgegebenpptr
- .
Beispiel
// 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
Eine geschützte virtuelle Memberfunktion, die versucht, die aktuellen Positionen für die gesteuerten Streams zu ändern.
virtual streampos seekoff(streamoff _Off,
ios_base::seekdir _Way,
ios_base::openmode _Which = ios_base::in | ios_base::out);
Parameter
_Aus
Die Position, die relativ zu _Way gesucht werden soll.
_Weg
Der Startpunkt für Offsetvorgänge. Mögliche Werte sind unter seekdir aufgeführt.
_Welche
Gibt den Modus für die Zeigerposition an. Standardmäßig können Lese- und Schreibpositionen geändert werden.
Rückgabewert
Wenn die Funktion eine der beiden Streampositionen erfolgreich ändert, gibt sie die resultierende Streamposition zurück. Andernfalls schlägt sie fehl und gibt eine ungültige Streamposition zurück.
Hinweise
Die geschützte virtuelle Memberfunktion versucht, die aktuellen Positionen für die gesteuerten Streams zu ändern. Für ein Objekt der Klasse strstreambuf besteht eine Streamposition lediglich aus einem Streamoffset. Das Offset Null legt das erste Element der kontrollierten Sequenz fest.
Die neue Position wird wie folgt bestimmt:
Ist
_Way == ios_base::beg
die neue Position der Anfang des Datenstroms plus _Off.Ist
_Way == ios_base::cur
die neue Position die aktuelle Datenstromposition plus _Off.Ist
_Way == ios_base::end
die neue Position das Ende des Datenstroms plus _Off.
Wenn _Which & ios_base::in
kein Zero vorhanden ist und der Eingabepuffer vorhanden ist, ändert die Funktion die nächste Position, die im Eingabepuffer gelesen werden soll. Wenn _Which & ios_base::out
es sich auch um einen Nichtzero-Wert _Way != ios_base::cur
handelt und der Ausgabepuffer vorhanden ist, legt die Funktion auch die nächste Position fest, die schreibgeschützt mit der nächsten zu lesenden Position übereinstimmt.
Ansonsten ändert die Funktion die nächste Position, die im Ausgabepuffer geschrieben werden soll, wenn _Which & ios_base::out
ungleich null ist. Andernfalls schlägt der Positionierungsvorgang fehl. Damit eine Positionierung erfolgreich ist, muss die resultierende Streamposition innerhalb der kontrollierten Sequenz liegen.
strstreambuf::seekpos
Eine geschützte virtuelle Memberfunktion, die versucht, die aktuellen Positionen für die gesteuerten Streams zu ändern.
virtual streampos seekpos(streampos _Sp, ios_base::openmode _Which = ios_base::in | ios_base::out);
Parameter
_Sp
Die Position, nach der gesucht werden soll.
_Welche
Gibt den Modus für die Zeigerposition an. Standardmäßig können Lese- und Schreibpositionen geändert werden.
Rückgabewert
Wenn die Funktion eine der beiden Streampositionen erfolgreich ändert, gibt sie die resultierende Streamposition zurück. Andernfalls schlägt sie fehl und gibt eine ungültige Streamposition zurück. Vergleichen Sie den Rückgabewert mit pos_type(off_type(-1))
, um festzustellen, ob die Streamposition ungültig ist.
Hinweise
Die geschützte virtuelle Memberfunktion versucht, die aktuellen Positionen für die gesteuerten Streams zu ändern. Für ein Objekt der Klasse strstreambuf besteht eine Streamposition lediglich aus einem Streamoffset. Das Offset Null legt das erste Element der kontrollierten Sequenz fest. Die neue Position wird durch _Sp bestimmt.
Wenn _Which
& ios_base::in nicht null ist und der Eingabepuffer vorhanden ist, ändert die Funktion die nächste Position, die im Eingabepuffer gelesen werden soll. Wenn _Which
& ios_base::out
nicht null ist und der Ausgabepuffer vorhanden ist, legt die Funktion auch die nächste Position fest, die schreibgeschützt mit der nächsten zu lesenden Position übereinstimmt. Andernfalls ändert die Funktion die nächste Position, um in den Ausgabepuffer zu schreiben, wenn _Which
& ios_base::out
ist und der Ausgabepuffer vorhanden ist. Andernfalls schlägt der Positionierungsvorgang fehl. Damit eine Positionierung erfolgreich ist, muss die resultierende Streamposition innerhalb der kontrollierten Sequenz liegen.
strstreambuf::str
Ruft freeze auf gibt dann einen Zeiger am Anfang der kontrollierten Sequenz zurück.
char *str();
Rückgabewert
Zeiger auf den Anfang der kontrollierten Sequenz.
Hinweise
Kein abschließendes Null-Element vorhanden, sofern Sie nicht explizit ein Element einfügen.
Beispiel
Unter strstreambuf::freeze finden Sie ein Beispiel, das str verwendet.
strstreambuf::strstreambuf
Konstruiert ein Objekt vom Typ 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);
Parameter
alloc_func
Funktion, mit der Speicher zugewiesen wird.
count
Bestimmt die Länge des Puffers, auf den getptr verweist. Wenn "getptr " kein Argument (erstes Konstruktorformular) ist, wird für die Puffer eine vorgeschlagene Zuordnungsgröße verwendet.
_Freefunc
Zum Freigeben von Pufferspeicher verwendete Funktion.
getptr
Ein Puffer, der für die Eingabe verwendet wird.
putptr
Ein Puffer, der für die Ausgabe verwendet wird.
Hinweise
Der erste Konstruktor speichert einen NULL-Zeiger in allen Zeigern, die den Eingabepuffer, den Ausgabepuffer und die strstreambuf-Zuweisung steuern. Legt den strstreambuf-Modus so fest, dass die kontrollierte Sequenz änderbar und erweiterbar ist. Sie akzeptiert auch die Anzahl als vorgeschlagene anfängliche Zuordnungsgröße.
Der zweite Konstruktor verhält sich wie der erste, mit der Ausnahme, dass er alloc_func als Zeiger auf die Funktion speichert, um Speicher zuzuweisen, und free_func als Zeiger auf die Funktion, um diesen Speicher freizurufen.
Die drei Konstruktoren:
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);
verhält sich auch wie der erste, mit der Ausnahme, dass getptr das Arrayobjekt angibt, das zum Halten der kontrollierten Sequenz verwendet wird. (Daher darf es kein Nullzeiger sein.) Die Anzahl der Elemente N im Array wird wie folgt bestimmt:
Wenn (Anzahl> 0), wird N gezählt.
If (count == 0), then N is
strlen((const char *) getptr )
.Wenn (Anzahl< 0) ist N INT_MAX.
Wenn putptr ein NULL-Zeiger ist, richtet die Funktion nur einen Eingabepuffer ein, indem Sie Folgendes ausführen:
setg(getptr,
getptr,
getptr + N);
Andernfalls legt die Eingabe- und Ausgabepuffer fest, indem sie Folgendes ausführt:
setg(getptr,
getptr,
putptr);
setp(putptr,
getptr + N);
In diesem Fall muss putptr im Intervall [ getptr, getptr + N] sein.
Die drei Konstruktoren:
strstreambuf(const char *getptr,
streamsize count);
strstreambuf(const signed char *getptr,
streamsize count);
strstreambuf(const unsigned char *getptr,
streamsize count);
verhalten sich wie:
streambuf((char *)getptr, count);
abgesehen davon, dass der gespeicherte Modus die kontrollierte Sequenz weder änderbar noch erweiterbar macht.
strstreambuf::underflow
Eine geschützte virtuelle Funktion zum Extrahieren des aktuellen Elements aus dem Eingabestream.
virtual int underflow();
Rückgabewert
Wenn die Funktion nicht erfolgreich abgeschlossen werden kann, wird EOF
zurückgegeben. Andernfalls wird das aktuelle Element, wie zuvor beschrieben, konvertiert in den Eingabestream zurückgegeben.
Hinweise
Die geschützte virtuelle Memberfunktion bemüht sich, das aktuelle Element ch
aus dem Eingabepuffer zu extrahieren, dann die aktuelle Datenstromposition voranzutreiben und das Element als (int)(unsigned char)ch
zurückzugeben. Dies kann nur auf eine Weise erfolgen: Wenn eine Leseposition verfügbar ist, wird es als in der Leseposition gespeichertes Element verwendet ch
und der nächste Zeiger für den Eingabepuffer vorangestellt.
Siehe auch
streambuf
Threadsicherheit in der C++-Standardbibliothek
iostream-Programmierung
iostreams-Konventionen