2010-08-19 5 views
2

J'ai écrit un 'sink' en utilisant boost :: iostreams, de sorte que je puisse essentiellement exécuter mon propre code lorsque quelqu'un essaie d'écrire sur un objet iostream. Malheureusement, il y a un tampon quelque part dans le système, de sorte que la fonction write() de mon Sink n'est appelée que toutes les 4 Ko environ. C'est un problème car le puits que j'implémente est de taille fixe (128 octets par exemple). Une fois que ces données ont été écrites, il faut retourner une erreur à l'appelant (quelque chose comme 'disque plein'). de la mémoire tampon, l'appelant est capable d'écrire quelques kilo-octets de données et aucune erreur n'est renvoyée, puis plus tard lorsque le tampon est vidé, les données supplémentaires sont silencieusement perdues, ce qui me cause des problèmes.Comment pouvez-vous désactiver le tampon dans un puits boost :: iostreams?

Est-ce que quelqu'un sait s'il est possible de désactiver ce tampon? J'ai essayé beaucoup de suggestions ici pour les iostreams génériques (par exemple pubsetbuf) mais aucun d'entre eux ne semble s'appliquer à l'implémentation de Boost.

Le code problème fait partie d'une bibliothèque, je travaille sur, qui est available from GitHub si elle aide (run « make check » et vous verrez un échec en raison de ce problème.)

Toute suggestion serait grandement apprécié!

+0

Hmm ... la documentation sur la mise en mémoire tampon dit '[A fournir dans la prochaine version]' daté du 02 fév 2008' ... soupir ... – Inverse

Répondre

0

Je pense que j'ai trouvé une solution de contournement. Vous devez décider manuellement quand vous voulez effectuer une chasse d'eau, mais si vous faites une recherche - même en cherchant la même position, c'est-à-dire stream.seekp(0, std::ios::cur) - alors tout va être vidé comme prévu.

C'est un peu une solution de contournement horrible, mais il semble faire le travail la plupart du temps.

Questions connexes