Los búferes de flujo representan dispositivos de entrada o salida y proporcionan una interfaz de bajo nivel para E / S sin formato a ese dispositivo. Los flujos, por otro lado, proporcionan una envoltura de nivel superior alrededor del búfer mediante funciones de E / S básicas sin formato y, especialmente, mediante funciones de E / S formateadas (es decir, operator<<
y operator>>
sobrecargas). Los objetos de flujo también pueden administrar la vida útil de un búfer de flujo.
Por ejemplo, una secuencia de archivos tiene un búfer de secuencia de archivos interno. La secuencia administra la vida útil del búfer y el búfer es lo que proporciona capacidades reales de lectura y escritura a un archivo. Los operadores de formato de la secuencia acceden en última instancia a las funciones de E / S sin formato del búfer de secuencia, por lo que solo tiene que utilizar las funciones de E / S de la secuencia y no es necesario tocar las funciones de E / S del búfer directamente.
Otra forma de comprender las diferencias es observar los diferentes usos que hacen de los objetos de configuración regional. Las transmisiones utilizan las facetas que tienen que ver con el formato, como numpunct
ynum_get
. También puede esperar que las sobrecargas de transmisión operator<<
y operator>>
los tipos de datos personalizados de tiempo o dinero utilicen las facetas de formato de tiempo y dinero. Los búferes de flujo, sin embargo, usan las facetas codecvt para convertir entre las unidades que usa su interfaz y los bytes. Entonces, por ejemplo, la interfaz para basic_streambuf<char16_t>
usos char16_t
y, por lo tanto, basic_streambuf<char16_t>
utiliza internamente codecvt<char16_t, char, mbstate_t>
de forma predeterminada para convertir las char16_t
unidades formateadas escritas en el búfer achar
unidades escritas en el dispositivo subyacente. Por lo tanto, puede ver que las transmisiones son principalmente para formatear y los búferes de transmisión brindan una interfaz de bajo nivel para la entrada o salida sin formato a dispositivos que pueden usar una codificación externa diferente.
Puede utilizar un búfer de flujo cuando solo desee acceso sin formato a un dispositivo de E / S. También puede utilizar búferes de transmisión si desea configurar varias transmisiones que compartan un búfer de transmisión (aunque tendrá que administrar cuidadosamente la vida útil del búfer). También hay búferes de flujo de propósito especial que podría querer usar, como wbuffer_convert
en C ++ 11, que actúa como una fachada para basic_streambuf<char>
que parezca un búfer de flujo de caracteres ancho. Utiliza la faceta codecvt con la que está construida en lugar de utilizar la faceta codecvt adjunta a cualquier configuración regional. Por lo general, puede lograr el mismo efecto simplemente utilizando un búfer de flujo amplio imbuido de una configuración regional que tenga la faceta adecuada.