Ecriture de contenu stringstream dans ofstream
-
11-07-2019 - |
Question
J'utilise actuellement std :: ofstream
comme suit:
std::ofstream outFile;
outFile.open(output_file);
J'essaie ensuite de passer un objet std :: stringstream
à outFile
comme suit:
GetHolesResults(..., std::ofstream &outFile){
float x = 1234;
std::stringstream ss;
ss << x << std::endl;
outFile << ss;
}
Mon fichier outFile
ne contient rien d'autre que des ordures: "0012E708". répété partout.
Dans GetHolesResults
, je peux écrire
outFile << "Foo" << std:endl;
et il sera affiché correctement dans outFile
.
Des suggestions sur ce que je fais mal?
La solution
Vous pouvez le faire, ce qui n’a pas besoin de créer la chaîne. Il permet au flux de sortie de lire le contenu du flux sur le côté droit (utilisable avec n’importe quel flux).
outFile << ss.rdbuf();
Autres conseils
Si vous utilisez std :: ostringstream
et vous demandez pourquoi rien ne s'écrit avec ss.rdbuf ()
, utilisez .str ()
fonction.
outFile << oStream.str();
Lors du passage d'un rstream streamd à un flux, les nouvelles lignes ne sont pas traduites. Le texte saisi peut contenir \ n
, donc remplacer ne fonctionnera pas. L'ancien code écrit dans un fstream et le fait passer à un stringstream perd la traduction endl.
Je préférerais écrire ss.str ();
au lieu de ss.rdbuf ();
(et utiliser un stringstream).
Si vous utilisez ss.rdbuf ()
, les drapeaux de format de outFile
seront réinitialisés, ce qui rendra votre code non réutilisable.
Par exemple, l'appelant de GetHolesResults (..., std :: ofstream & outFile)
peut vouloir écrire quelque chose comme ceci pour afficher le résultat dans un tableau:
outFile << std::setw(12) << GetHolesResults ...
... et vous demandez pourquoi la largeur est ignorée.