Ich verwende derzeit std::ofstream
wie folgt:
std::ofstream outFile;
outFile.open(output_file);
Dann versuche ich, ein std::stringstream
-Objekt wie folgt an outFile
zu übergeben:
GetHolesResults(..., std::ofstream &outFile){
float x = 1234;
std::stringstream ss;
ss << x << std::endl;
outFile << ss;
}
Nun enthält meine outFile
nur noch Müll: "0012E708" wiederholt sich überall.
In GetHolesResults
kann ich schreiben
outFile << "Foo" << std:endl;
und es wird korrekt in outFile
ausgegeben.
Irgendwelche Vorschläge, was ich falsch mache?
Sie können dies tun, ohne die Zeichenfolge erstellen zu müssen. Dadurch wird der Ausgabestrom den Inhalt des Streams auf der rechten Seite auslesen (mit beliebigen Streams verwendbar).
outFile << ss.rdbuf();
Wenn Sie std::ostringstream
verwenden und sich fragen, warum nichts mit ss.rdbuf()
geschrieben wird, verwenden Sie die .str()
-Funktion.
outFile << oStream.str();
Bei der Übergabe eines Stringstreams an einen Stream werden Zeilenumbrüche nicht übersetzt. Der Eingabetext kann \n
enthalten, sodass das Ersetzen von Suchen nicht funktioniert. Der alte Code wurde in einen Fstream geschrieben und auf einen Stringstream umgestellt, wodurch die Endl-Übersetzung verloren ging.
Ich würde lieber ss.str();
anstelle von ss.rdbuf();
schreiben (und einen Stringstream verwenden).
Wenn Sie ss.rdbuf()
verwenden, werden die Format-Flags von outFile
zurückgesetzt, sodass Ihr Code nicht mehr verwendet werden kann. Das heißt, der Aufrufer von GetHolesResults(..., std::ofstream &outFile)
möchte möglicherweise so etwas schreiben, um das Ergebnis in einer Tabelle anzuzeigen:
outFile << std::setw(12) << GetHolesResults ...
... und frage mich, warum die Breite ignoriert wird.