En el lenguaje de programación C ++ , la biblioteca de entrada / salida se refiere a una familia de plantillas de clase y funciones de apoyo en la biblioteca estándar de C ++ que implementan capacidades de entrada / salida basadas en flujo. [1] [2] Es un orientado a objetos alternativa a la de C ARCHIVO basados en corrientes de la biblioteca estándar C . [3] [4]
Historia
Bjarne Stroustrup , el creador de C ++, escribió la primera versión de la biblioteca corriente de I / O en 1984, como una alternativa de tipo seguro y extensible para la biblioteca de E / S de C . [5] La biblioteca ha sufrido una serie de mejoras desde esta primera versión, incluida la introducción de manipuladores para controlar el formato y la plantilla para permitir su uso con tipos de caracteres distintos de char
.
En la estandarización en 1998, la biblioteca se movió al std
espacio de nombres y el encabezado principal cambió de
a
. Es esta versión estandarizada la que se cubre en el resto del artículo.
Descripción general
La mayoría de las clases de la biblioteca son en realidad plantillas de clases muy generalizadas. Cada plantilla puede operar en varios tipos de caracteres, e incluso las operaciones en sí mismas, como la forma en que se comparan dos caracteres para determinar la igualdad, se pueden personalizar. Sin embargo, la mayoría del código necesita realizar operaciones de entrada y salida utilizando solo uno o dos tipos de caracteres, por lo que la mayoría de las veces se accede a la funcionalidad a través de varios typedefs , que especifican nombres para combinaciones de plantilla y tipo de carácter de uso común.
Por ejemplo, se basic_fstream
refiere a la plantilla de clase genérica que implementa operaciones de entrada / salida en flujos de archivos. Por lo general, se usa como fstream
un alias para basic_fstream
, o, en otras palabras, para basic_fstream
trabajar con caracteres de tipo char
con el conjunto de operaciones de caracteres predeterminado.
Las clases de la biblioteca se pueden dividir aproximadamente en dos categorías: abstracciones e implementaciones. Las clases, que entran en la categoría de abstracciones, proporcionan una interfaz que es suficiente para trabajar con cualquier tipo de flujo. El código que utiliza estas clases no depende de la ubicación exacta desde la que se leen o se escriben los datos. Por ejemplo, dicho código podría escribir datos en un archivo, un búfer de memoria o un conector web sin una recompilación. Las clases de implementación heredan las clases de abstracción y proporcionan una implementación para un tipo concreto de fuente de datos o sumidero. La biblioteca proporciona implementaciones solo para secuencias basadas en archivos y secuencias basadas en búfer de memoria.
Las clases de la biblioteca también se pueden dividir en dos grupos según si implementan operaciones de bajo o alto nivel. Las clases que se ocupan de cosas de bajo nivel se denominan búferes de flujo. Operan con caracteres sin proporcionar ninguna funcionalidad de formato. Estas clases rara vez se utilizan directamente. Las clases de alto nivel se denominan flujos y proporcionan varias capacidades de formato. Están construidos sobre búferes de flujo.
La siguiente tabla enumera y categoriza todas las clases proporcionadas por la biblioteca de entrada y salida.
Clase | Explicación | Typedefs |
---|---|---|
Buffers de transmisión (funcionalidad de bajo nivel) | ||
basic_streambuf | proporciona una interfaz de entrada / salida abstracta de bajo nivel, que se puede implementar para fuentes de datos o sumideros concretos. Rara vez se usa directamente. |
|
basic_filebuf | implementa una interfaz de entrada / salida de bajo nivel para transmisiones basadas en archivos. Rara vez se usa directamente. |
|
basic_stringbuf | implementa una interfaz de entrada / salida de bajo nivel para transmisiones basadas en cadenas. Rara vez se usa directamente. |
|
Clases de apoyo | ||
ios_base | gestiona la información de formato y el estado de excepción | N / A |
basic_ios | gestiona un búfer de flujo |
|
Buffers de flujos de entrada (funcionalidad de alto nivel) | ||
basic_istream | envuelve un búfer de flujo abstracto y proporciona una interfaz de entrada de alto nivel, como capacidades de formato. |
|
basic_ifstream | un flujo de entrada que envuelve un búfer de flujo de archivos. Proporciona funciones para abrir o cerrar un archivo además de las del flujo de entrada genérico. |
|
basic_istringstream | un flujo de entrada que envuelve un búfer de flujo de cadenas. Proporciona funciones para acceder a la cadena subyacente además de las del flujo de entrada genérico. |
|
Búferes de flujos de salida (funcionalidad de alto nivel) | ||
basic_ostream | envuelve un búfer de flujo abstracto y proporciona una interfaz de salida de alto nivel, como capacidades de formato. |
|
basic_ofstream | un flujo de salida que envuelve un búfer de flujo de archivos. Proporciona funciones para abrir o cerrar un archivo además de las del flujo de salida genérico. |
|
basic_ostringstream | un flujo de salida que envuelve un búfer de flujo de cadenas. Proporciona funciones para acceder a la cadena subyacente además de las del flujo de salida genérico. |
|
Buffers de flujos de entrada / salida (funcionalidad de alto nivel) | ||
basic_iostream | envuelve un búfer de flujo abstracto y proporciona una interfaz de entrada / salida de alto nivel, como capacidades de formato. |
|
basic_fstream | un flujo de entrada / salida que envuelve un búfer de flujo de archivos. Proporciona funciones para abrir o cerrar un archivo además de las de flujo de entrada / salida genérico |
|
basic_stringstream | una secuencia de entrada / salida que envuelve un búfer de secuencia de cadena. Proporciona funciones para acceder a la cadena subyacente además de las del flujo de entrada / salida genérico |
|
Archivos de encabezado
Las clases de la biblioteca de entrada / salida residen en varios encabezados.
contiene las definiciones deios_base
y lasbasic_ios
clases, que administran la información de formato y el búfer de flujo asociado.
contiene la definición debasic_istream
plantilla de clase, que implementa la entrada formateada.
contiene la definición debasic_ostream
plantilla de clase, que implementa la salida formateada.
contiene la definición debasic_iostream
plantilla de clase, que implementa entrada y salida formateada, e incluye
,
y
.
contiene las definiciones debasic_ifstream
,basic_ofstream
ybasic_fstream
plantillas de clase, implemento de entrada, salida y entrada / salida con formato de secuencias de archivo.
contiene las definiciones debasic_istringstream
,basic_ostringstream
ybasic_stringstream
plantillas de clase que implementan la entrada formateada, salida y entrada / salida de flujos basados en cadenas.
contiene manipuladores de formato.
contiene declaraciones hacia adelante de todas las clases en la biblioteca de entrada / salida.
Búferes de transmisión
Hay doce clases de búfer de flujo definidas en el lenguaje C ++ como la tabla.
Clases de apoyo
ios_base
y basic_ios
son dos clases que gestionan los bits de nivel inferior de una secuencia. ios_base
almacena información de formato y el estado de la secuencia. basic_ios
gestiona el búfer de flujo asociado. basic_ios
se conoce comúnmente como simplemente ios
o wios
, que son dos definiciones de tipo para basic_ios
con un tipo de carácter específico. basic_ios
y ios_base
muy raramente son usados directamente por programadores. Por lo general, se accede a su funcionalidad a través de otras clases, como las iostream
que las heredan. [6] [7]
Typedefs
Nombre | descripción |
---|---|
ios | conveniencia typedef para basic_ios trabajar con caracteres de tipochar |
wios | conveniencia typedef para basic_ios trabajar con caracteres de tipowchar_t |
streamoff | admite operaciones internas. |
streampos | mantiene la posición actual del puntero del búfer o del archivo. |
wstreampos | mantiene la posición actual del puntero del búfer o del archivo. |
streamsize | especifica el tamaño de la secuencia. |
Formateando manipuladores
Nombre | Descripción |
---|---|
boolalpha / noboolalpha | especifica si las variables de tipo bool aparecen como true y false o como 0 y 1 en la ruta. |
skipws / noskipws | especifica si se omite el espacio en blanco en las operaciones de entrada |
showbase / noshowbase | especifica si se muestra la base de notación del número |
showpoint / noshowpoint | especifica si se muestra la parte fraccionaria de un número de punto flotante, cuando la parte fraccionaria es cero |
showpos / noshowpos | especifica si se muestra + para números positivos |
unitbuf / nounitbuf | especifica si la salida debe almacenarse en búfer |
uppercase / nouppercase | especifica si se deben usar caracteres en mayúscula en la salida de entero hexadecimal y de punto flotante |
left / right /internal | especifica cómo se debe justificar un número |
dec / oct /hex | especifica la notación en la que debe mostrarse un número entero |
fixed / scientific / hexfloat ( C ++ 11 ) / defaultfloat (C ++ 11) | especifica la notación en la que debe mostrarse un número de punto flotante |
Flujos de entrada / salida
C ++ de entrada / salida corrientes se definen principalmente por iostream
, un archivo de cabecera que es parte de la biblioteca de C ++ estándar (el nombre se refiere a I Nput / O utput corriente ). En C ++ y su predecesor, el lenguaje de programación C , no existe una sintaxis especial para la entrada o salida de datos en streaming. En cambio, estos se combinan como una biblioteca de funciones . Al igual que el cstdio
encabezado heredado de stdio.h de C , iostream
proporciona servicios básicos de entrada y salida para programas C ++. iostream utiliza los objetos cin
, cout
, cerr
, y clog
para el envío de datos hacia y desde los flujos estándares de entrada, salida, error (no tamponada) y log (tamponada), respectivamente. Como parte de la biblioteca estándar de C ++ , estos objetos forman parte del espacio de nombres . [8]std
El cout
objeto es de tipo ostream
, lo que sobrecarga el operador de desplazamiento de bits a la izquierda para que realice una operación completamente ajena a las operaciones a nivel de bits y, en particular, evalúe el valor del argumento de la izquierda, lo que permite múltiples operaciones en el mismo objeto ostream, esencialmente como un objeto diferente. sintaxis para el método en cascada , exponiendo una interfaz fluida . Los objetos y también son de tipo , por lo que también sobrecargan a ese operador. El objeto es de tipo , lo que sobrecarga al operador de desplazamiento de bits correcto. Las direcciones de los operadores de desplazamiento de bits hacen que parezca que los datos fluyen hacia el flujo de salida o se alejan del flujo de entrada.cerr
clog
ostream
cin
istream
Formateo de salida
Métodos
width(int x) | número mínimo de caracteres para la próxima salida |
fill(char x) | carácter utilizado para rellenar en el caso de que sea necesario alargar el ancho para llenar el mínimo. |
precision(int x) | establece el número de dígitos significativos para números de punto flotante |
Manipuladores
Los manipuladores son objetos que pueden modificar un flujo usando los operadores <<
o >>
.
endl | "end line": inserta una nueva línea en la secuencia y llama a flush. |
ends | "cadena final": inserta un carácter nulo en la secuencia y llama a flush. |
flush | obliga a un flujo de salida a escribir cualquier carácter almacenado en búfer |
ws | hace que una corriente de entrada 'coma' espacios en blanco |
showpoint | le dice a la secuencia que muestre el punto decimal y algunos ceros con números enteros |
Se pueden encontrar otros manipuladores usando el encabezado iomanip
.
Crítica
Los manipuladores de formato son mucho más difíciles de usar y leer que las cadenas de formato printf equivalentes . También deben "restablecerse" al final o obtendrá sus efectos inesperadamente en la siguiente declaración de salida.
Algunas implementaciones de la biblioteca estándar de C ++ tienen cantidades significativas de código muerto . Por ejemplo, GNU libstdc ++ construye automáticamente un entorno local cuando se crea un ostream
incluso si un programa nunca usa ningún tipo (fecha, hora o dinero) que afecte un entorno local, [9] y un "¡Hola, mundo!" Enlazado estáticamente . El programa que usa
GNU libstdc ++ produce un ejecutable de un orden de magnitud mayor que un programa equivalente que usa
. [10] Existen implementaciones parciales de la biblioteca estándar C ++ diseñada para entornos con limitaciones de espacio; Es
posible que omitan características que los programas en dichos entornos pueden no necesitar, como la compatibilidad con la configuración regional. [11]
Convenciones de nombres
Ejemplos de
El canónico "¡Hola, mundo!" El programa se puede expresar de la siguiente manera:
#include int main () { std :: cout << "¡Hola, mundo!" << std :: endl ; }
Este programa generaría "¡Hola, mundo!" seguido de una nueva línea y un vaciado del búfer de flujo de salida estándar.
El siguiente ejemplo crea un archivo llamado 'file.txt' y pone el texto '¡Hola, mundo!' seguido de una nueva línea en él.
#include int main () { std :: ofstream file ( "file.txt" ); file << "¡Hola, mundo!" << std :: endl ; }
Referencias
- ^ ISO / IEC 14882: 2003 Lenguajes de programación - C ++. [lib.string.streams] / 1
- ^ Stanley B. Lippman, Josee Lajoie (1999). C ++ Primer (tercera edición). Massachusetts: Addison-Wesley. págs. 1109-1112 . ISBN 0-201-82470-1.
- ^ Bjarne Stroustrup (1997). El lenguaje de programación C ++ (tercera ed.). Addison-Wesley. págs. 637–640 . ISBN 0-201-88954-4.
- ^ Stanley B. Lippman, Josee Lajoie (1999). C ++ Primer (tercera edición). Massachusetts: Addison-Wesley. págs. 1063–1067 . ISBN 0-201-82470-1.
- ^ Bjarne Stroustrup. "Una historia de C ++: 1979-1991" (PDF) .
- ^ Stanley B. Lippman, Josee Lajoie (1999). C ++ Primer (tercera edición). Massachusetts: Addison-Wesley. págs. 1112-1120 . ISBN 0-201-82470-1.
- ^ " Visual Studio 2010" . Microsoft MSDN: Visual Studio 2010 . Consultado el 28 de septiembre de 2011 .
- ^ Holzner, Steven (2001). C ++: Libro negro . Scottsdale, Ariz .: Coriolis Group. pag. 584. ISBN 1-57610-777-9.
... endl, que vacía el búfer de salida y envía una nueva línea al flujo de salida estándar.
- ^ Código fuente GNU libstdc ++,
bits/ios_base.h
- ^ C ++ frente a C - Pin ocho
- ^ "Biblioteca uClibc ++ C ++" . Consultado el 6 de enero de 2012 .
enlaces externos
- Referencia de C ++ para la biblioteca de entrada / salida
- Iostreams de la biblioteca estándar de Apache C ++
- Tutorial completo sobre cómo dar formato a la salida en C ++