Verwendung von die STL-Stringstream-Klasse in C++

Jinku Hu 12 Oktober 2023
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
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

Verwandter Artikel - C++ IO