Freigeben über


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 chgleich 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::begdie neue Position der Anfang des Datenstroms plus _Off.

  • Ist _Way == ios_base::curdie neue Position die aktuelle Datenstromposition plus _Off.

  • Ist _Way == ios_base::enddie 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::curhandelt 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)chzurü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