stringstream führt zu Crash



  • Such mal den Fehler bei dir. Die Chance, dass ein Lib nicht geht und du der erste bist dem das auffällt, ist extrem gering.

    Wahrscheinlich zerschiest du irgendwas im Speicher. Nimm mal nen Debugger und versuch ein bisschen logisch vorzugehen und bau nicht nur irgendwo wirr deinen Code um.



  • Nichts würde ich lieber tun als den Debugger zu benutzen. Aber ich schreibe hier ein Plugin für 3ds Max 9, und wenn ich das mit laufendem Debugger ausführe, dann weigert sich 3ds Max, weil ein Debugger läuft, weiterzumachen. Folglich kann ich den nicht einsetzen.

    Im übrigen sagte ich nicht, dass die Lib grundsätzlich nicht geht, sondern dass sie nur bei mir möglicherweise irgendwie kaputt sein könnte.

    Habe es jetzt auch irgendwie zum Laufen bekommen, indem ich ein völlig unverwandtes Problem woanders gelöst habe... Aber wie es halt so ist: Neues Problem:

    Ich habe einen String von der Art "*float*, *float*, *float*", den ich in ein Array aus drei floats eintragen möchte. Dazu mache ich folgendes:

    int end;
    for (int i = 0; i < 3; i++) {
    	end = value.find(',');
    	buffer.str(value.substr(0, end));
    	buffer >> theFloats[i];
    	value.erase(0, end + 2);
    }
    

    Hierbei wird aber nur die erste Zahl richtig ausgelesen. Bei den anderen beiden scheint operator >> von buffer einfach nichts zu tun. Bei den ostringstreams habe ich irgendwo, irgendwann mal gelesen, dass der Aufruf von str() dazu führt, dass der Inhalt eingefroren wird, also nichts mehr weiter rein geht. Gilt das denn auch für istringstream? Und wenn ja, wie schafft man es dann, den Inhalt auszutauschen, damit man so ein Objekt überhaupt mehrmals benutzen kann? Das sollte doch möglich sein, oder nicht?



  • David Schneider schrieb:

    ...Im übrigen sagte ich nicht, dass die Lib grundsätzlich nicht geht, sondern dass sie nur bei mir möglicherweise irgendwie kaputt sein könnte...

    Dann wäre es wahrscheinlicher das sie in keister Weise läuft. Schreib ein Miniprogram mit stringstream, wenn das läuft, liegt es mit nahezu 100%iger Sicherheit an deinem Programm. Der Absturz an der Stelle heißt auch nicht das der Fehler unbedingt dort liegt, ich tippe eher darauf das du dir - wobei auch immer - den Stack im Vorfeld mehr oder weniger zerschossen hast (Verwendung nichtinitialisierter Zeiger...).

    cu André



  • Selbstverständlich würde sie dann in keinster Weise laufen. Nur hatte ich das ja nicht probiert und kann auch keine Aussage darüber machen. Aber es scheitn sich ja bestätigt zu haben, dass eine heap corruption an anderer Stelle den Fehler verursachte. Nachdem ich die behoben hatte (drei Objekte in ein Array der Länge eins), und es nhun geht, vermute ich mal einen Zusammenhang.

    Aber das ist ja auch gar nicht mehr mein Problem. 😉

    Okay, okay, klassischer Fall von "zu früh gepostet": Ein Aufruf von buffer.clear() bringt die ganze Sache zum funzen. Wüsste jetzt allerdings nicht, was ich da für error flags produziert haben könnte, die beim zweiten Mal eine ordentliche Ausführung verhindern könnten. Aber solange es jetzt geht, soll mir das ja egal sein.



  • Mal eine Frage zu ungefähr dem selben Thema:

    Im Moment bastle ich mir meine ostringstreams zusammen, und will die dann alle der Reihe nach in einen ofstream füttern, um in eine Datei zu schreiben. Was ich da im Moment mache, um vernünftige Ergebnisse zu bekommen, ist:

    ostringstream buffer;
    // buffer wird irgendwie gefüllt...
    
    ofstream file;
    file << buffer.str();
    

    Geht natürlich einwandfrei, sieht aber unnötig umständlich aus. Die Frage wäre aber, ob das nicht irgendwie auch direkt funktioniert? Die beiden Streams sind doch von der selben Klasse (ostream) abgeleitet, da müssten die doch irgendwie auch direkt aneinanderhängbar sein. Leider scheint dabei aber nur die Adresse des buffers geschrieben zu werden, statt des Inhaltes. Muss ich also zwangsweise über den String gehen?



  • ostringstream buffer;
    
    ofstream file;
    file << buffer.rdbuf();
    


  • Geht das schneller? Ich nehm's mal an.

    EDIT: Nö, es geht gar nicht. Eingebaut, ausprobiert. Aber alles ab dem einen nach oben vorgeschlagener Art veränderten Aufruf kommt nicht mehr in die Datei.



  • David Schneider schrieb:

    Wüsste jetzt allerdings nicht, was ich da für error flags produziert haben könnte, die beim zweiten Mal eine ordentliche Ausführung verhindern könnten. Aber solange es jetzt geht, soll mir das ja egal sein.

    der stream wurde bis zum ende gelesen, und damit "eof" gesetzt.

    es gibt allerdings auch eine einfachere lösung:

    istringstream buffer("3.142, 1.414, 2.718");
    
    for (int i = 0; i < 3; i++)
    {
       buffer >> theFloats[i];
       buffer.get(); //schlucke ','
    }
    


  • David Schneider schrieb:

    Geht das schneller? Ich nehm's mal an.

    den streampuffer (stream.rdbuf()) zu übergeben ist die schnellste möglichkeit, die es gibt.



  • Ah, stimmt, so geht's natürlich aus. Hatte gar nicht an die Methoden à la get gedacht, die ja jeder Stream hat.

    Was das andere betrifft, siehe meinen Edit weiter oben. Scheint nicht zu gehen.



  • für das "scheint nicht zu gehen" bräuchte ich wohl meine glaskugel, die ist aber gerade in der reinigung.

    was geht nicht? ist die datei geöffnet? noch etwas im stringstream drin? ...?



  • Ich beschrieb das Problem oben ausführlich. Es wird nichts in die Datei geschrieben, und zwar ab dem ersten Aufruf von operator <<, der einen streambuf bekommt, selbst wenn die Aufrufe danach wieder mit strings arbeiten.



  • ach sorry, mein fehler: habe übersehen, dass in dem beispiel ein ostringstream vorkommt (war noch ganz bei istringstream).

    mach doch einfach einen stringstream daraus, dann wird es funktionieren.



  • Das stimmt in der Tat. Gibt's einen Grund dafür, dass das nur mit stringstream geht? Und allgemein: Lohnt es sich denn dann bei solchen "Aussetzern" überhaupt, die spezialisierten Klassen istringstream und ostringstream zu benutzen?


Anmelden zum Antworten