Verwendung von die STL-Stringstream-Klasse in C++
Dieser Artikel demonstriert die Verwendung der STL-Klasse stringstream
in C++.
Verwenden Sie die Klasse stringstream
, um Eingabe-/Ausgabeoperationen an String-Streams in C++ durchzuführen
Im Allgemeinen gibt es drei Arten von STL-Stream-basierten I/O-Bibliotheksklassen: zeichenbasiert, Datei und Zeichenkette. Jeder von ihnen wird normalerweise für Szenarien verwendet, die am besten für ihre Eigenschaften geeignet sind. String-Strings bieten nämlich keinen temporären String-Puffer zum Speichern ihrer Daten, im Gegensatz zur Verbindung mit einem I/O-Kanal. Die Klasse std::stringstream
implementiert Eingabe-/Ausgabeoperationen für string-basierte Streams. Sie können ein Objekt dieses Typs als Zeichenkettenpuffer behandeln, der mithilfe von Stream-Operationen und leistungsstarken Memberfunktionen bearbeitet werden kann.
Zwei der nützlichsten Funktionen der Klasse stringstream
sind str
und rdbuf
. Der erste wird verwendet, um die Kopie des zugrunde liegenden String-Objekts abzurufen. Beachten Sie, dass das zurückgegebene Objekt temporär ist und das Ende des Ausdrucks zerstört. Sie sollten also eine Funktion aus dem Ergebnis der Funktion str
aufrufen.
Der gleiche Prozess kann mit einem String-Objekt als Argument aufgerufen werden, um den Inhalt des stringstream
mit dem bereitgestellten Wert zu setzen. Sie sollten immer die Funktion str
für das Objekt stringstream
aufrufen, wenn es in einen cout
-Stream eingefügt wird, da sonst ein Compiler-Fehler auftritt. Beachten Sie auch, dass das vorherige Verhalten seit dem C++11-Standard implementiert ist.
Auf der anderen Seite kann die Member-Funktion rdbuf
verwendet werden, um den Zeiger auf das zugrunde liegende Roh-String-Objekt abzurufen. Dieser verhält sich so, als ob das String-Objekt an den cout
-Stream übergeben würde. Folglich wird der Inhalt des Puffers gedruckt, wie im folgenden Beispiel gezeigt.
#include <iostream>
#include <sstream>
using std::cout;
using std::endl;
using std::istringstream;
using std::stringstream;
int main() {
stringstream ss1;
ss1 << "hello, the number " << 123 << " and " << 32 << " are printed" << endl;
cout << ss1.str();
stringstream ss2("Hello there");
cout << ss2.rdbuf();
return EXIT_SUCCESS;
}
Ausgabe:
hello, the number 123 and 32 are printed
Hello there
Eine weitere Eigenschaft einer stringstream
-Klasse besteht darin, dass sie numerische Werte in einen String-Typ umwandeln kann. Beachten Sie, dass der vorherige Codeausschnitt die Zeichenkettenliterale und Zahlen in ein stringstream
-Objekt eingefügt hat. Wenn wir den Inhalt mit der Funktion str
abrufen, ist das Ganze außerdem ein String-Typ und kann als solcher behandelt werden.
Es gibt drei verschiedene string-basierte Stream-Objekte: stringstream
, istringstream
und ostringstream
. Die beiden letzteren unterscheiden sich, da sie nur Eingabe- bzw. Ausgabeoperationen bereitstellen; dies impliziert, dass einige Memberfunktionen nur bestimmte Stream-Typen betreffen.
Das folgende Codebeispiel ruft beispielsweise die Funktion putback
für die Objekte stringstream
und istringstream
separat auf. Die Memberfunktion putback
wird verwendet, um das einzelne Zeichen an den Eingabestrom anzuhängen. Daher ist es nur bei einem stringstream
-Objekt erfolgreich, das Eingabe- und Ausgabeeigenschaften bereitstellt.
#include <iostream>
#include <sstream>
using std::cout;
using std::endl;
using std::istringstream;
using std::stringstream;
int main() {
stringstream ss2("Hello there");
cout << ss2.rdbuf();
if (ss2.putback('!'))
cout << ss2.rdbuf() << endl;
else
cout << "putback failed" << endl;
istringstream ss3("Hello there");
ss3.get();
if (ss3.putback('!'))
cout << ss3.rdbuf() << endl;
else
cout << "putback failed" << endl;
return EXIT_SUCCESS;
}
Ausgabe:
Hello there!
putback failed
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook