2016-12-15 2 views
1

Je veux écrire un tas de données dans un objet ostream et renvoyer le nombre d'octets écrits. Par exemple:Comment puis-je suivre le nombre d'octets écrits dans un objet std :: ostream?

using namespace std; 
size_t writeStuffToStream(ostream &stream) 
{ 
    stream << some_string << some_integer << some_other_arbitrary_object << endl; 
    return number_of_bytes_written; 
} 

Il est la solution de contournement évident d'écrire tout un stringstream et d'obtenir le nombre d'octets de cela, puis écrire le stringstream au courant, mais cela prend du temps supplémentaire et de la mémoire.

Je réalise également que si toutes les données que je voulais écrire étaient des chaînes préexistantes, il n'y aurait pas de problème. C'est some_integer et some_other_arbitrary_object qui sont le problème.

+1

Vous pouvez enchaîner des objets streambuf, vous pouvez donc dériver un streambuf de std :: streambuf, et déléguer des opérations au streambuf d'origine après avoir enregistré les infos du compteur. http://www.mr-edd.co.uk/blog/beginners_guide_streambuf –

Répondre

0

Utilisez la méthode ostreamtellp().

Notez que cela peut échouer si le ostream fourni ne prend pas en charge les positions. Dans ce cas, vous pouvez créer un ostringstream temporaire pour formater vos données, puis extraire le string, obtenir sa longueur et l'envoyer à l'entrée ostream.

Vous pouvez écrire probablement aussi une coutume qui ostream envoyer à un autre ostream et compter les caractères émis. Je m'attendais à trouver une méthode virtuelle pour remplacer dans ostream pour écrire seulement des caractères, mais je ne l'ai pas trouvé :(Vous pouvez réutiliser le code stringstream et remplacer les écritures de la mémoire tampon pour écrire dans un autre ostream string-stream.cc

+0

Ouais, je suis un peu rebuté par le fait que 'tellp()' n'est pas garanti de fonctionner pour tous les objets. Je ne veux pas avoir à créer un 'stringstream 'intermédiaire Comment créer un' ostream' personnalisé qui peut compter les octets écrits, si je ne peux pas compter les octets écrits en premier lieu? – Matt

+0

Je vais y jeter un coup d'oeil et mettre à jour mon commentaire;) –