Stringstream: Integer oder String?



  • Hi Community! 🙂

    Ich möchte in einem String die einzelnen Teilwörter aufschlüsseln. Dazu muss ich aber auch wissen, ob sich an einer bestimmten Stelle ein Integer befindet, oder ein normaler String.
    Ich hab versucht, das über Stringstreams zu lösen.
    Allerdings gelangt aus dem Stringstream in der Schleife nix in den temporären String. 😕
    Mit Zahlen funktioniert allerdings alles.

    Meine Frage nun: Was mache ich hier bloß wieder falsch?

    #include <iostream>
    #include <string>
    #include <sstream>
    
    int main()
    {
    	std::string myString("-44 test 410 blubb");
    	std::stringstream myStream;
    	int iTmp;
    	std::string sTmp;
    
    	myStream<<myString;
    
      for (int i=0; i<=3; i++)
      {
        if (myStream>>iTmp)
          std::cout<<"[Zahl]: "<<iTmp<<std::endl;
        else if (!myStream.eof())
        {
          myStream>>sTmp;
          std::cout<<"[String]: "<<sTmp<<std::endl;
          std::cout<<"[Length]: "<<sTmp.length()<<std::endl;
        }
      }
    	return 0;
    }
    

    Viele Grüße,
    Mao



  • #include <iostream>
    #include <string>
    #include <sstream>
    
    int main()
    {
        std::stringstream ss("-44 test 410 blubb");
        int zahl(0);
        ss >> zahl;
        std::cout << "Zahl: " << zahl << "\n";
        std::string string;
        ss >> string;
        std::cout << "String: \"" << string << "\" (" << string.length() << ")\n"; 
        ss >> zahl;
        std::cout << "Zahl: " << zahl << "\n";
        ss >> string;
        std::cout << "String: \"" << string << "\" (" << string.length() << ")" << std::endl; 
    }
    

    ...



  • Hallo.

    Hm, nein. So war das nicht gemeint. 😃

    Der String war ja nur ein Beispiel, wie es aussehen könnte. Es geht mir ja darum, dass ich erkenne möchte, dass das gerade gelesene eine Zahl ist, oder nicht. 🙂

    Danke trotzdem.
    Mao



  • Naja also du kannst nur hingehen und gucken ob das lesen in einen Integer erfolgreich ist, wenn nicht dann lässt du es in einen String schreiben ... aber kann sein das es was besseres gibt ... frag dazu aber mal lieber Werner 😛



  • Wenn keine Zahl eingelesen werden konnte, dann wird ein Fehlerflag beim Stream gesetzt, d.h. dieses mußt du dann erst wieder löschen.

    if (myStream>>iTmp)
          std::cout<<"[Zahl]: "<<iTmp<<std::endl;
    else
    {
      myStream.clear(); // <--
      myStream>>sTmp;
    }
    


  • @(D)Evil:
    Ja, so hatt ich das ja auch versucht (siehe ganz oben meinen Code).
    Allerdings hab ich das/die Fehlerflag(s) nicht gelöscht, wie Th gesagt hatte.

    Danke! 🙂
    Mao



  • Machts doch sauber und schaut vorher mit peek() was kommt und jenachdem in das richtige dann einlesen:

    string str = "";
    int zahl = 0;
    
    if( myStream.peek() != EOF && isAlpha(myStream.peek()) )
        myStream >> zahl;
    else
        myStream >> str;
    


  • KasF: bei IsAlpha(...) eine Zahl einlesen 😃

    Und dann müßte auch noch auf ein Minuszeichen getestet werden und ob danach dann eine Zahl kommt (und bei Fließkommazahlen evtl. noch auf das Komma bzw. den Punkt)...



  • Th schrieb:

    KasF: bei IsAlpha(...) eine Zahl einlesen 😃

    Uuups 🙂

    Th schrieb:

    Und dann müßte auch noch auf ein Minuszeichen getestet werden und ob danach dann eine Zahl kommt (und bei Fließkommazahlen evtl. noch auf das Komma bzw. den Punkt)...

    string str = "";
    int zahl = 0;
    
    int ch = EOF;
    
    if( (ch = myStream.peek()) != EOF && ( (ch == '-') || isdigit(ch) ) )
        myStream >> zahl;
    else if( ch != EOF )
        myStream >> str;
    

    Wenn Mao nur zwischen Zahlen und Strings unterscheiden will und in seinem Stream alles sauber steht, dann reicht das doch vollkommen ?



  • Hallo! 🙂

    (Sorry, dass ich mich nicht gemeldet hatte.)
    Ja, sauber ist immer gut. 🙂
    Danke dafür KasF, Th!

    Mao


Anmelden zum Antworten