Question

Pour des fins éducatives Je veux créer un tampon ostream et flux à faire:

  1. fix Boutiens lorsque vous faites << maVar;
  2. conserver dans un récipient deque au lieu d'utiliser std: ou Cout écrire dans un fichier
  3. log des données supplémentaires, comme combien de fois j'ai <<, combien de fois je l'ai fait .write, la quantité d'octets que j'écrit et combien de fois je flush (). Mais je ne ai pas besoin toutes les informations.

J'ai essayé, mais la surcharge horiblement. J'ai essayé la surcharge d'écriture en faisant

ostream& write( const char* s, streamsize n ) 

dans ma classe basic_stringstream2 (je copiais pâte basic_stringstream dans mon fichier cpp et modifié), mais le code continue à utiliser basic_ostream. Je regardais à travers le code et il semble que je dois surcharger xsputn (qui mentionne pas sur cette page http : //www.cplusplus.com/reference/iostream/ostream ), mais qu'est-ce que je dois autre surcharge? et comment dois-je construire ma classe (que fait-il besoin d'hériter, etc.)?

Était-ce utile?

La solution

L'approche canonique consiste à définir votre propre streambuf. Vous devriez jeter un oeil à:

Autres conseils

Pour A + C) Je pense que vous devriez regarder facettes, ils modifient la façon dont les objets sont écrits en caractères. Vous pouvez stocker les statistiques ici aussi bien sur combien de fois vous transmis en continu vos objets. Vérifiez Comment formater mes propres objets lors de l'utilisation STL flux pour un exemple.

Pour B) Vous devez créer votre propre streambuf et connectez votre ostream à ce tampon (argument du constructeur). Voir liens de Luc + Dérivation de nouvelles classes de streambuf . En bref, vous devez implémenter cela pour un ostream (minimum):

  • trop-plein (mettre un char ou un tampon de rinçage) ( lien )
  • xsputn (mettre un tableau de caractères de tampon) ( lien )
  • synchronisation ( lien )

Je ne suis pas sûr que ce que vous voulez faire est possible. Les opérateurs de << ne sont pas virtuelles. Donc, vous pouvez définir yourstream &operator << (yourstream &strm, int i) faire ce que vous voulez avec la conversion de endian et de comptage, et cela fonctionnera lorsque votre code appelle directement. Mais si vous passez un objet yourstream dans une fonction qui attend un ostream, chaque fois que les appels de fonction <<, il ira à la version originale ostream au lieu du vôtre.

Si je comprends bien, les cours d'eau des installations ont été mis en place afin que vous puissiez « facilement » définir un nouveau type de flux qui utilise un autre type de mémoire tampon (comme, par exemple, un deque de caractères), et vous pouvez très facilement ajouter le support pour produire vos propres classes via <<. Je ne pense pas que vous l'intention d'être en mesure de redéfinir la couche intermédiaire entre les deux.

Et surtout, tout le point de l'interface << est de fournir une sortie de texte bien formaté, alors qu'il semble que vous voulez réellement sortie binaire. (Sinon, la référence à « endian » n'a pas de sens.) Même en supposant qu'il existe une certaine façon de le faire, je ne sais pas, il produira une sortie binaire maladroit au mieux. Par exemple, considérons la surcharge de l'utilisateur final à la sortie d'un point dans l'espace 3D. La version de l'utilisateur final de << sera probablement faire quelque chose comme << '(' << x << ", " << y << ", " << z << ')'. Ce sera agréable dans un flux de texte, mais il y a beaucoup de personnages gaspillés et complètement inutiles dans un flux binaire, qui idéalement juste utiliser << x << y << z. (Et combien d'appels à << devraient les compte comme?)

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