stringstream



  • Hoi,

    ich arbeite mich im Moment in C++-Strings ein, weil ich ein Problem habe, daß sich denke ich damit recht gut lösen läßt.
    Hier mal mein Testprogramm:

    #include <sstream> 
    #include <iostream> 
    
    using namespace std; 
    
    class myClass : public stringstream 
    { 
    public: 
       void TextOut() 
       { 
          cout << "TextOut: " << str() << endl; 
       } 
    }; 
    
    void main() 
    { 
       myClass   stream; 
       string         str = "Hello World, this is my first hello world programm with streams"; 
    
       stream << str << endl; 
       stream << "And this is line 2" << endl; 
    
       string         str2; 
    
       stream.TextOut(); 
    
       while(getline(stream, str2)) 
       { 
          cout << str2 << endl; 
       } 
    
       cout << endl << "Ende" << endl; 
    
       stream.TextOut(); 
       stream << "Neue Zeile" << endl; 
       stream.TextOut(); 
    
       while(getline(stream, str2)) 
       { 
          cout << str2 << endl; 
       } 
    
    }
    

    Die Ausgabe davon ist:

    TextOut: Hello World, this is my first hello world programm with streams 
    And this is line 2 
    
    Hello World, this is my first hello world programm with streams 
    And this is line 2 
    
    Ende 
    TextOut: Hello World, this is my first hello world programm with streams 
    And this is line 2 
    
    TextOut: Hello World, this is my first hello world programm with streams 
    And this is line 2
    

    Warum wird die "Neue Zeile" nie ausgeben? Bzw warum wird die letzte while-Schleife überhaupt nicht betreten?
    Ein stream.flush() hilft auch nicht weiter...
    Irgendwer ne Idee?

    thx,
    fallen



  • The_Fallen schrieb:

    Warum wird die "Neue Zeile" nie ausgeben? Bzw warum wird die letzte while-Schleife überhaupt nicht betreten?

    Der Stream steht vermutlich auf fail (also !good). Damit wird die nächste Operation keinen Erfolg haben (hier die Eingabe). Du musst den Stream wieder in einen nutzbaren Zustand bringen¹. Das hat nichts mit deiner Ableitung zu tun die aber nicht schön ist (weil stringstream ist sehr unvirtuell).

    1. Wie bzw ob das geht weiß ich nicht. Die Sache mit den Streams (wenigstens denen, die man für die gleichzeite Ein- und ausgabe nimmt) ist die, dass die Abstraktion mEn nichts nützt, weil man immer noch wissen muss, was der Unterschied zwischen bad, fail, eof, good und ! ist und ob es verschiedene Lese- und Ausgabe'zeiger' gibt. Das ist Grund genug diese Funktionalität zu meiden, IMHO.

    PS: Der GCC3.2 verweigert 'void main' beim Übersetzten.



  • Hmm, danke. Ich glaube, ich löse das anders indem ich nen ostream und nen istream als member habe und dann << und >> überlade.
    Und wegen "void main()"... Keine Ahnung, hab ich mir irgendwann mal angewöhnt, weil ich sowieso keine Fehler zurückgebe und VC hat da keine Probleme mit...


Anmelden zum Antworten