Streams und Löschen?



  • Hi,

    ich häng grad fest. Ich spiele ein wenig mit stringstreams rum und steh auf dem Schlauch. Wie löscht man den Inhalt eines Streams? 😕

    Hier mal ein bissl Kode:

    ostringstream	stream;
    	string			string;
    
    	for (int i=1; i<4; ++i)
    	{
    		// feed the stream
    		for (int j=1; j<4; ++j)
    		{
    			stream << "(" << (float) (j*i)*1.23 << ")";
    		}
    
    		// reset the stream ???
    		string = stream.str();
    		stream.clear();
    		cout << string << endl;
    	}
    
    	std::cin.get();
    

    Eigentlich möchte ich drei Tripel angezeigt bekommen, aber ich hab keine Methode gefunden, den Stream zu reseten. Warum wird das einem so schwer gemacht?

    Grüße,
    don_basto.



  • Habs.

    // reset the stream
    string = stream.str();
    stream.str("");
    cout << string << endl << endl;
    


  • don_basto schrieb:

    ich häng grad fest. Ich spiele ein wenig mit stringstreams rum und steh auf dem Schlauch. Wie löscht man den Inhalt eines Streams? 😕

    .. am besten gar nicht. Es ist grundsätzlich immer besser, Variablen erst dann zu deklarieren, wenn sie benötigt werden. Streams kann man derart verändern, dass es immer besser ist, sie wieder neu anzulegen.

    Also etwa so:

    for (int i=1; i<4; ++i)
        {
            ostringstream stream;
            // feed the stream
            for (int j=1; j<4; ++j)
            {
                stream << "(" << (float) (j*i)*1.23 << ")";
            }
            string string = stream.str();
            cout << string << endl;
        }
    

    don_basto schrieb:

    Eigentlich möchte ich drei Tripel angezeigt bekommen, aber ich hab keine Methode gefunden, den Stream zu reseten. Warum wird das einem so schwer gemacht?

    .. weil's nicht not tut. 😉

    Gruß
    Werner



  • Werner Salomon schrieb:

    ...
    .. weil's nicht not tut. 😉

    Gruß
    Werner

    Scheint mir auch so 😃

    @don_basto: Warum überhaupt zwischendurch den stream ausgeben und resetten ?
    Du kannst ein endl (oder besser: Ein "/n") ebenso in einen ostringstream werfen wie in cout und dann den fertigen ostringstream "couten".
    Damit sparst Du Dir auch jeden Fall das dauernde Resetten.
    Mir ist noch nicht ganz klar, ob Du nun Deine Ergebnisse nun in einem ostringstream sammeln oder per cout ausgeben willst. Vielleicht ist es einfacher, wenn Du einfach das eine tust und das andere lässt.

    Also entweder

    ostringstream stream;
        for (int i=1; i<4; ++i)
        {
            // feed the stream
            for (int j=1; j<4; ++j)
            {
                stream << "(" << (float) (j*i)*1.23 << ")";
            }
        }
        // Hier irgendwas mit stream machen ... 
        // vielleicht ausgeben, in Datei schreiben, auf Hintern tätowieren, .... 
        // was man mit ostreams halt so tut.
        ...
    

    oder

    for (int i=1; i<4; ++i)
        {
            for (int j=1; j<4; ++j)
            {
                cout << "(" << (float) (j*i)*1.23 << ")";
            }
        }
        ...
    

    Alternativ kannst Du das natürlich auch in eine Funktion packen und beim Aufruf entscheiden:

    void getValues(ostream& o = cout) {
        for (int i=1; i<4; ++i)
        {
            // feed the stream
            for (int j=1; j<4; ++j)
            {
                o << "(" << (float) (j*i)*1.23 << ")";
            }
        }
    }
    

    😃

    Gruß,

    Simon2.

    EDIT: Warum sind denn jetzt eigentlich Zeilennummern vor meinem Sourcecode ? 😕 Ist ja ganz praktisch, aber .... warum ?



  • @simon2:
    In meinem Falle ist es praktisch den Stream zu leeren. Ich hab den Stream in einer Klasse als Attribut eingebettet, die ihn mit Daten füllt. Nachdem der Inhalt des Streams abgefragt wurde (zum Verarbeiten,Loggen, etc.), brauch ich die Daten nicht mehr, will sie ja nicht mehrfach verarbeiten!


Anmelden zum Antworten