J'essaie d'en savoir un peu plus sur le fonctionnement des flux d'E/S en C++, et je ne sais vraiment pas quand utiliser quoi.
Qu'est-ce qu'un streambuf
exactement?
Quand dois-je utiliser un streambuf
, par rapport à un string
, un istream
ou un vector
? (Je connais déjà les trois derniers, mais pas comment streambuf
se compare à eux, si c'est le cas.)
Les tampons de flux représentent les périphériques d'entrée ou de sortie et fournissent une interface de bas niveau pour les E/S non formatées vers ce périphérique. Les flux, d'autre part, fournissent un wrapper 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 operator<<
et operator>>
surcharges). Les objets de flux peuvent également gérer la durée de vie d'un tampon de flux.
Par exemple, un flux de fichiers a un tampon de flux de fichiers interne. Le flux gère la durée de vie du tampon et c'est le tampon qui fournit les capacités réelles de lecture et d'écriture à un fichier. Les opérateurs de formatage du flux accèdent finalement aux fonctions d'E/S non formatées du tampon de flux, vous n'avez donc qu'à utiliser les fonctions d'E/S du flux et vous n'avez pas besoin de toucher directement les fonctions d'E/S du tampon.
Une autre façon de comprendre les différences consiste à examiner les différentes utilisations qu'ils font des objets régionaux. Les flux utilisent les facettes liées au formatage telles que numpunct
et num_get
. Vous pouvez également vous attendre à ce que les surcharges du flux operator<<
et operator>>
pour les types de données de temps ou d'argent personnalisés, les facettes de formatage de temps et d'argent seront utilisées. Les tampons de flux, cependant, utilisent les facettes codecvt afin de convertir entre les unités que leur interface utilise et les octets. Ainsi, par exemple, l'interface pour basic_streambuf<char16_t>
les usages char16_t
et donc basic_streambuf<char16_t>
utilise en interne codecvt<char16_t, char, mbstate_t>
par défaut pour convertir le formaté char16_t
unités écrites dans le tampon dans char
unités écrites sur le périphérique sous-jacent. Vous pouvez donc voir que les flux sont principalement destinés au formatage et que les tampons de flux fournissent une interface de bas niveau pour l'entrée ou la sortie non formatée vers des périphériques qui peuvent utiliser un codage externe différent.
Vous pouvez utiliser un tampon de flux lorsque vous souhaitez uniquement un accès non formaté à un périphérique d'E/S. Vous pouvez également utiliser des tampons de flux si vous souhaitez configurer plusieurs flux qui partagent un tampon de flux (bien que vous deviez gérer soigneusement la durée de vie du tampon). Vous pouvez également utiliser des tampons de flux spéciaux, tels que wbuffer_convert
en C++ 11 qui fait office de façade pour un basic_streambuf<char>
pour le faire ressembler à 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 quel environnement local. Vous pouvez généralement obtenir le même effet en utilisant simplement un tampon de flux large imprégné d'une locale qui a la facette appropriée.
Avec l'aide de streambuf
, nous pouvons travailler à un niveau inférieur pair . Il permet d'accéder aux tampons sous-jacents.
Voici quelques bons exemples: Copier, charger, rediriger et tee en utilisant streambufs C++ et en référence à la comparaison, cela pourrait être utile,
Voir ceci pour plus de détails: Bibliothèque IOstream