You are here

Wie füllt man einen istringstream wieder auf?

Dafür steht die Funktion istringstream::str(std::string&) zur Verfügung. Man muss jedoch den Zustand des String-Streams beachten.

Beispiel:
  std::string sstr1("1.0 2");
  std::string sstr2("1.0 2");
  int i;
  double d;

  std::istringstream ist(sstr1);
  ist >> d;
  // Zustand : d = 1.0; sstr1 = " 2"

  ist.str(sstr2);
  // okay, Zustand: ist = "1.0 2"

  ist >> d >> i;
  // Zustand: d = 1.0, i = 2, ist =""

  ist.str(sstr1);
  // das ging schief, Zustand: ist = ""

Die letzte Initialisierung schlug fehl. Der Grund dafür liegt darin, dass sich der Stream seinen Zustand merkt und in verschiedenen Zustandsbits sichert. Der Zustand kann man mit den Funktionen good(), eof(), fail() und bad() abfragen. Ein Stream, dessen Zustand nicht good ist, ignoriert jede weitere Aktion. Das ist im obigen Fall eingetreten, da der Stream nach der Extraktion seines letzten Zeichens leer war. Um den Stream wieder in den Zustand good zu versetzen und weitere Aktionen durchführen zu können, muss die Funktion clear() aufgerufen werden. Damit erweitert sich das Beispiel zu:

  std::string sstr1("1.0 2");
  std::string sstr2("1.0 2");
  int i;
  double d;

  std::istringstream ist(sstr1);
  ist >> d;
  // Zustand : d = 1.0; sstr1 = " 2"

  // Falls Zustand nicht good, clear()
  if (!ist.good())
    ist.clear();
  ist.str(sstr2);
  // okay, Zustand: ist = "1.0 2"

  ist >> d >> i;
  // Zustand: d = 1.0, i = 2, ist =""

  // oder sofort clear()
  ist.clear();
  ist.str(sstr1);
  // Zustand : ist = "1.0 2"