86 votes

Qu'est-ce que streambuf exactement? Comment l'utiliser?

Je suis en train d'essayer d'en apprendre un peu plus sur le fonctionnement des flux d'E/S en C++, et je suis vraiment perdu quant à quand utiliser quoi.

Qu'est-ce qu'un streambuf exactement ?
Quand est-ce que j'utilise un streambuf, par rapport à une string, un istream, ou un vector ? (Je connais déjà les trois derniers, mais je ne sais pas comment streambuf se compare à eux, s'il se compare du tout.)

0 votes

C'est une mauvaise abstraction d'un tampon de flux.

1 votes

@Pubby : Euh, qu'est-ce qu'un "tampon de flux"? En quoi est-ce différent d'un flux ou d'un tampon?

0 votes

D'après ce que je comprends, un flux formate l'entrée/sortie et la stocke dans son tampon.

74voto

COD3BOY Points 7466

Avec l'aide de streambuf, nous pouvons travailler à un niveau encore plus bas. Cela permet d'accéder aux tampons sous-jacents.

Voici quelques bons exemples : Copier, charger, rediriger et connecter en utilisant les streambufs C++ et en référence à la comparaison, cela pourrait être utile,

entrer la description de l'image ici

Voir ceci pour plus de détails : Bibliothèque IOstream

2 votes

J'ai cherché partout quelque chose qui pourrait expliquer les streambuf's aussi bien que cet article. Merci de m'avoir aidé à le trouver!

1 votes

L'exemple est toujours le meilleur. Merci

57voto

bames53 Points 38303

Les tampons de flux représentent les dispositifs d'entrée ou de sortie et fournissent une interface de bas niveau pour les E/S non formatées vers ce dispositif. Les flux, en revanche, fournissent une enveloppe de niveau supérieur autour du tampon au moyen de fonctions d'E/S non formatées de base et en particulier via des fonctions d'E/S formatées (c'est-à-dire les surcharges operator<< et operator>>). Les objets de flux peuvent également gérer la durée de vie d'un tampon de flux.

Par exemple, un flux de fichier a un tampon de flux de fichier interne. Le flux gère la durée de vie du tampon et c'est le tampon qui fournit les capacités de lecture et d'écriture réelles d'un fichier. Les opérateurs de mise en forme du flux accèdent finalement aux fonctions d'E/S non formatées du tampon de flux, de sorte que vous n'avez jamais besoin d'utiliser directement les fonctions d'E/S du tampon.

Une autre façon de comprendre les différences est d'examiner les différents usages qu'ils font des objets de localisation. Les flux utilisent les facettes liées à la mise en forme telles que numpunct et num_get. Vous pouvez également vous attendre à ce que les surcharges des opérateurs de flux operator<< et operator>> pour les types de données temporelles ou monétaires personnalisés utilisent les facettes de formatage pour le temps et l'argent. Les tampons de flux, cependant, utilisent les facettes codecvt pour convertir entre les unités utilisées par leur interface et les octets. Par exemple, l'interface pour basic_streambuf utilise char16_t et donc basic_streambuf utilise en interne codecvt par défaut pour convertir les unités formatées de char16_t écrites dans le tampon en unités de char écrites dans le dispositif sous-jacent. Ainsi, vous pouvez voir que les flux sont principalement destinés à la mise en forme et que les tampons de flux fournissent une interface de bas niveau pour un accès non formaté aux dispositifs qui peuvent utiliser un codage externe différent.

Vous pouvez utiliser un tampon de flux lorsque vous souhaitez uniquement accéder de manière non formatée à un dispositif d'E/S. Vous pouvez également utiliser des tampons de flux si vous souhaitez configurer plusieurs flux partageant un tampon de flux (bien que vous deviez gérer soigneusement la durée de vie du tampon). Il existe également des tampons de flux spéciaux que vous pourriez vouloir utiliser, tels que wbuffer_convert en C++11 qui agit comme une façade pour un basic_streambuf pour le faire paraître comme un tampon de flux de caractères larges. Il utilise la facette codecvt avec laquelle il est construit au lieu d'utiliser la facette codecvt attachée à n'importe quelle localité. Vous pouvez généralement obtenir le même effet en utilisant simplement un tampon de flux large imprégné d'une localité ayant la facette appropriée.

20 votes

Cela est 5 ans trop tard, donc je ne vais pas le poster comme réponse et annuler cette réponse, mais pour toute personne encore confuse par la terminologie même après avoir lu ceci : streambuf est pour les données brutes (par exemple, des octets bruts, des entiers bruts, etc.), alors que stream est pour les données formatées (texte, entiers formatés en tant que texte, etc.). En d'autres termes, stream représente la couche d'analyse (ou de sérialisation). Lorsque vous travaillez avec des chaînes de caractères simples, vous pouvez techniquement utiliser l'un ou l'autre, mais la signification est différente : streambuf signifie que vous voulez que les données brutes soient la chaîne de caractères elle-même, tandis que stream abstrait le codage.

0 votes

@Mehrdad, puis-je demander ce que cela signifie de dire que stream abstrait l'encodage ? :D Pouvez-vous expliquer un peu plus ou fournir du matériel supplémentaire ?

3 votes

@Rick: Bien sûr. stream est responsable de lecture et écriture d'objets vers un streambuf. streambuf est responsable de conserver et restaurer des octets (ou caractères/mots/ce que vous préférez les appeler) à partir d'un emplacement de stockage d'octets. Le mapping entre les objets et les octets est ce que je désignais comme "encodage". Un exemple de cela est qu'un stream accepterait un int et déciderait ensuite comment le convertir en char, et vice-versa - il pourrait utiliser un format big-endian, un format little-endian, un format inversé par bits, un format à 7 bits seulement, ou n'importe quoi d'autre. c'est-à-dire qu'il abstrait le format de stockage.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X