it-swarm.com.de

Stringstream-Inhalte in ofstream schreiben

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?

42
Eric

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();
11
Digital_Reality

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. 

3
2ndshot

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.

1
chipsbarrier