2008-11-27 18 views
37

Je suis actuellement à l'aide std::ofstream comme suit:contenu stringstream écriture dans ofstream

std::ofstream outFile; 
outFile.open(output_file); 

Alors je tente 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; 
} 

Maintenant, mon outFile ne contient que poubelle: "0012E708" répété partout.

En GetHolesResults Je peux écrire

outFile << "Foo" << std:endl; 

et affichera correctement outFile.

Une suggestion sur ce que je fais mal?

+1

Je vous suggère de reformuler le titre à quelque chose dans la ligne de: « ecriture contenu stringstream dans ofstream » (ou ostream pour ce qui importe) –

+1

Eric, vous devez marquer la réponse de Johannes acceptée afin que je puisse supprimer le mien (ce qui est clairement pire que son approche) –

+1

Ok, c'est fait. Mais à l'époque, j'ai utilisé votre solution =) – Eric

Répondre

67

Vous pouvez le faire, ce qui n'a pas besoin de créer la chaîne. Il rend le flux de sortie lu le contenu du flux sur le côté droit (utilisable avec tous les flux).

outFile << ss.rdbuf(); 
+5

Je suis curieux: pourquoi cette solution fonctionne avec 'std :: stringstream' mais pas avec' std :: ostringstream'? Dans le second cas, je reçois un fichier vide. –

+3

@JaviV car vous pouvez [écrire uniquement] (http://en.cppreference.com/w/cpp/io/basic_ostream) dans 'std :: oANYSTREAM' et seulement lire' std :: iANYSTREAM'. Il n'y aura pas de sens pour 'output_stream' s'il a aussi des opérations' read'. Si vous avez besoin à la fois d'utiliser 'std :: ANYSTREAM' et vous êtes à la maison :) –

3

Lors du passage d'un rdbuf de stringstream à un flux des sauts de ligne ne sont pas traduits. Le texte d'entrée peut contenir \n alors trouver remplacer ne fonctionnera pas. L'ancien code a écrit à un fstream et la commutation à un train de chaînes perd la traduction endl.

+2

Cela devrait être un commentaire pas une réponse parce que vous n'avez pas dit comment écrire un std :: stringstream à un std :: ofstream – bitek

8

Si vous utilisez std::ostringstream et vous vous demandez pourquoi rien n'est écrit avec ss.rdbuf(), alors utilisez la fonction .str().

outFile << oStream.str(); 
+4

votre réponse m'a conduit à la réalisation suivante: pour obtenir un tableau 'char' de' ss', vous pouvez faire 'ss.str(). c_str()'. (Juste poster ici pour le bénéfice des débutants qui trébuchent sur ce dans le futur.) – dbliss

+1

@Digital_Reality, merci! rien n'était écrit quand j'ai utilisé rdbuff. Quelle est la raison pour ça? – Nasir