Estoy tratando de aprender un poco más sobre cómo funcionan los flujos de E / S en C ++, y estoy realmente confundido sobre cuándo usar qué.
¿Qué es exactamente un streambuf
?
¿Cuándo utilizo a streambuf
, en comparación con a string
, an istream
o a vector
? (Ya conozco los últimos tres, pero no cómo se streambuf
comparan con ellos, si es que los conozco ).
Respuestas:
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<<
yoperator>>
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ónoperator<<
yoperator>>
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 parabasic_streambuf<char16_t>
usoschar16_t
y, por lo tanto,basic_streambuf<char16_t>
utiliza internamentecodecvt<char16_t, char, mbstate_t>
de forma predeterminada para convertir laschar16_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 parabasic_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.fuente
streambuf
es para datos sin procesar (por ejemplo, bytes sin procesar, entradas sin , etc.), mientras questream
es para datos preparados (texto, enteros formateados como texto, etc.). Dicho de otra manera,stream
representa la capa de análisis (o serialización). Cuando se trata de cadenas simples, técnicamente puede usar cualquiera de las dos, pero el significado es diferente:streambuf
significa que desea que los datos sin procesar sean la cadena en sí, mientras questream
abstrae la codificación.stream
abstrae la codificación ? : D ¿Puede explicarlo un poco más o proporcionar más material?stream
es responsable de leer y escribir objetos en astreambuf
.streambuf
es responsable de guardar y restaurar bytes (o caracteres / palabras / como prefiera llamarlos) desde una ubicación de almacenamiento de bytes. El mapeo entre objetos y bytes es a lo que me refería como "codificación". Un ejemplo de esto es que astream
aceptaría unint
y luego decidiría cómo convertirlo enchar
s, y viceversa; podría usar el formato big-endian, el formato little-endian, un formato invertido de bits, un formato de 7 bits solo formato, o cualquier otra cosa. es decir, abstrae el formato de almacenamiento.Con la ayuda de
streambuf
, podemos trabajar en un nivel aún más bajo . Permite el acceso a los búferes subyacentes.Aquí hay algunos buenos ejemplos: Copie, cargue, redirija y tee usando streambufs C ++ y en referencia a la comparación, esto podría ser útil,
Vea esto para más detalles: Biblioteca IOstream
fuente