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.
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.
0 votes
Lire TC++PL SE (S) 21.6.
3 votes
@moshbear : Désolé, je n'ai aucune idée de ce à quoi cela fait référence.
1 votes
@La Édition Spéciale du livre de programmation C++ de Mehrdad Stroustrup
0 votes
@moshbear: Oh... Je l'achèterai quand j'en aurai l'occasion je suppose, merci.
0 votes
C'est pour C++ ce que K&R est pour C. C'est bien.
6 votes
Si cela va vous faire vous sentir mieux, j'ai travaillé avec C++ pendant 15 ans et je ne comprends toujours pas la partie IO de la bibliothèque C++. Il n'y a pas eu un seul projet où j'ai eu l'occasion de l'utiliser.
0 votes
J'ai trouvé que le code d'exemple de ce lien était assez explicatif : cplusplus.com/reference/ios/ios/rdbuf