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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top