In diesem Abschnitt wird beschrieben, wie eine Zeichenkette als Puffer für einen Datenstrom eingesetzt werden kann. #include <iostream.h> class strstreambuf : public streambuf { public:
}; | |||||||||||||||
Ein strstreambuf-Objekt ist ein streambuf-Objekt, das ein Feld von mehreren Bytes (Zeichenkette) zur Aufnahme einer Folge von Zeichen einsetzt. Unter der Maßgabe, dass char* vor das char-Objekt zeigen soll (auf das es eigentlich gerichtet ist), ergibt sicheine direkte Zuordnung zwischen den abstrakten get/put-Zeigern (siehe sbufpub) und den char*-Zeigern. Das Verschieben der Zeiger entspricht genau der Inkrementierung und Dekrementierung der char*-Werte. strstreambuf unterstützt einen dynamischen Modus, um die Forderung nach Zeichenketten beliebiger Länge erfüllen zu können. Einem strstreambuf-Objekt im dynamischen Modus wird die Speicherkapazität für die Zeichenkette nach Bedarf zugewiesen. Wird die Zeichenfolge für das derzeit eingesetzte Feld zu lang, wird sie in ein neues Feld kopiert. Für die folgenden Beschreibungen wird vorausgesetzt, dass
Konstruktorenstrstreambuf() Ein leeres strstreambuf-Objekt wird im dynamischen Modus angelegt. Das bedeutet, dass - durch die Operatoren new und delete - automatisch Speicherkapazität zugewiesen wird, um alle Zeichen aufnehmen zu können, die in das strstreambuf-Objekt eingefügt werden. Da hierzu unter Umständen das Kopieren der Originalzeichen notwendig wird, sollte das Programm beim Einfügen vieler Zeichen die Funktion setbuf() (Beschreibung folgt) einsetzen, um das strstreambuf-Objekt zu informieren. strstreambuf(void * (*a)(long), void * (*f)(void*)) Ein leeres strstreambuf-Objekt im dynamischen Modus wird angelegt. a wird als Belegungsfunktion im dynamischen Modus eingesetzt. Das an a übergebene Argument ist ein long-Wert, der die Anzahl der zuzuweisenden Bytes darstellt. Wenn a den Wert 0 aufweist, wird der Operator new eingesetzt. f wird eingesetzt, um die von a gelieferten Bereiche freizugeben (oder zu löschen). Das Argument zu f ist ein Zeiger auf das von a belegte Feld. Bei einem Wert von 0 für f wird der Operator delete eingesetzt. strstreambuf(int n) Ein leeres strstreambuf-Objekt wird im dynamischen Modus angelegt. Die anfängliche Speicherplatzzuweisung umfasst mindestens n Bytes. strstreambuf(char * ptr, int n, char * pstart) Es wird ein strstreambuf-Objekt angelegt, das die bei ptr beginnenden Bytes als Puffer nutzt. Das Objekt befindet sich im statischen Modus und kann nicht dynamisch erweitert werden. Wenn n positiv ist, werden die bei ptr beginnenden n Bytes als strstreambuf-Objekt verwendet. Ist n gleich 0, wird angenommen, daß ptr auf den Beginn einer mit 0 beendeten Zeichenkette gerichtet ist; die Bytes dieser Zeichenkette(ohne das beendende Nullzeichen) stellen das strstreambuf-Objekt dar. Bei negativem n wird angenommen, dass das strstreambuf-Objekt eine unendliche Länge aufweist. Der Zeiger get wird auf ptr und der Zeiger put wird auf den Wert von pstart initialisiert. Wenn pstart den Wert 0 besitzt, werden Speicherversuche als Fehler behandelt.Ist pstart hingegen ungleich 0, besteht die Zeichenfolge zur Entnahme (der Bereich get) - zu Anfang - aus den Bytes zwischen ptr und pstart. Für pstart gleich 0 umfasst der Bereich get anfangs das gesamte Feld. Elementfunktionen ssb->freeze(int n) Unterbindet (für n ungleich 0) oder erlaubt (für n gleich 0) die automatische Löschung des aktuellen Feldes. Eine Löschung erfolgt gewöhnlich, wenn mehr Speicherbereich benötigt oder ssb zerstört wird. Nur dynamisch zugewiesener Speicherbereich wird freigegeben. Das Speichern von Zeichen in einem strstreambuf-Objekt, das im dynamischen Belegungsmodus vorlag und nun "eingefroren" ist, ist ein Fehler (die Folgen einer solchen Operation sind nicht definiert). Es ist aber möglich, ein solches strstreambuf-Objekt "aufzutauen" und dann Zeichen zu speichern. char* ptr=ssb->str() Ein Zeiger auf das erste char-Objekt des aktuellen Feldes wird geliefert und ssb "eingefroren". Wenn ssb mit einer expliziten Feldangabe angelegt wurde, zeigt ptr auf dieses Feld. Befindet sich ssb hingegen im dynamischen Belegungsmodus und hat noch keine Speicherung stattgefunden, kann ptr auch den Wert 0 aufweisen. streambuf * sb=ssb->setbuf(char *, int n) Der Wert n wird von ssb zwischengespeichert, und bei der nächsten dynamischen Speicherplatzbelegung werden wieder mindestens n Bytes zugewiesen. | |||||||||||||||
BEISPIEL | Das folgende Programm deklariert eine Variable vom Typ strstreambuf und initialisiert sie mit der Zeichenkette p. Die Elementfunktion str() wird aufgerufen, um zu gewährleisten, dass die Zeichenkette p vom strstreambuf-Konstruktor erfolgreich verarbeitet wird. #include <strstream.h> #include <iostream.h> #include <string.h> char * const p = "Wirklich eine lange Zeichenkette\ abcdefghijlkmnopqrstuvwxyz\n"; int main() { strstreambuf s(p, 0, (char *) NULL); /* Zeichenkette p liegt in strstreambuf vor. */ /* get-Zeiger ist auf Beginn von p gerichtet. */ char *tp = s.str(); cout << "Laenge des Original-Strings " << strlen(p) << endl; cout << "Laenge des strstreambuf-Strings " << strlen(tp) << endl; return 0; } Das Ergebnis der Programmausführung ist: Laenge des Original-Strings 77 Laenge des strstreambuf-Strings 77 % CCM0998 Verbrauchte CPU-Zeit: 0.0018 Sekunden Beachten Sie, dass sich die Länge der Originalzeichenkette nicht verändert hat. | ||||||||||||||
SIEHE AUCH | |||||||||||||||