Articulo de referencia

Biblioteca de entrada/salida de C++

En el lenguaje de programación C++ , la biblioteca de entrada/salida se refiere a una familia de plantillas de clase y funciones de soporte en la Biblioteca Estándar de C++ que ...

En el lenguaje de programación C++ , la biblioteca de entrada/salida se refiere a una familia de plantillas de clase y funciones de soporte en la Biblioteca Estándar de C++ que implementan capacidades de entrada/salida basadas en flujos. [ 1 ] [ 2 ] Es una alternativa orientada a objetos a los flujos basados ​​en FILE de la biblioteca estándar de C. [ 3 ] [ 4 ]

Historia

Bjarne Stroustrup , el creador de C++, escribió la primera versión de la biblioteca de E/S de flujo en 1984, como una alternativa segura en cuanto a tipos y extensible a la biblioteca de E/S de C. [ 5 ] La biblioteca ha experimentado una serie de mejoras desde esta versión inicial, incluyendo la introducción de manipuladores para controlar el formato y la creación de plantillas para permitir su uso con tipos de caracteres distintos de char.

La estandarización de 1998 hizo que la biblioteca se trasladara al stdespacio de nombres y que el encabezado principal cambiara de <iostream.h>a <iostream>. Es esta versión estandarizada la que se trata en el resto del artículo.

En C++20<format> , se agregó el encabezado , std::format()agregando std::formatterclases. [ 6 ] En C++23<print> , se agregó el encabezado , que agrega std::print()y std::println(), permitiendo la impresión formateada a cualquier flujo de salida o archivo. [ 7 ] Ambos se basaron en la fmtlib existente de Victor Zverovich. [ 8 ]

Descripción general

La mayoría de las clases de la biblioteca son, en realidad, plantillas de clase muy generalizadas. Cada plantilla puede operar con diversos tipos de caracteres, e incluso las operaciones en sí, como la comparación de dos caracteres para determinar si son iguales, pueden personalizarse. Sin embargo, la mayor parte del código necesita realizar operaciones de entrada y salida utilizando solo uno o dos tipos de caracteres, por lo que, en la mayoría de los casos, se accede a la funcionalidad mediante varias definiciones de tipo (typedefs) , que especifican nombres para combinaciones comunes de plantilla y tipo de carácter.

Por ejemplo, basic_fstream<CharT, Traits>se refiere a la plantilla de clase genérica que implementa operaciones de entrada/salida en flujos de archivos. Normalmente se usa como , fstreamque es un alias de basic_fstream<char,char_traits<char>>, o, en otras palabras, basic_fstreamtrabajando con caracteres de tipo charcon el conjunto de operaciones de caracteres predeterminado.

Las clases de la biblioteca se pueden dividir en dos categorías principales: abstracciones e implementaciones. Las clases de abstracción proporcionan una interfaz suficiente para trabajar con cualquier tipo de flujo de datos. El código que utiliza estas clases no depende de la ubicación exacta de lectura o escritura de los datos. Por ejemplo, dicho código podría escribir datos en un archivo, un búfer de memoria o un socket web sin necesidad de recompilación. Las clases de implementación heredan de las clases de abstracción y proporcionan una implementación para un tipo concreto de origen o destino de datos. La biblioteca solo proporciona implementaciones para flujos basados ​​en archivos y flujos basados ​​en búferes de memoria.

Las clases de la biblioteca también se pueden dividir en dos grupos según implementen operaciones de bajo o alto nivel. Las clases que manejan operaciones 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 diversas capacidades de formato. Se basan en los búferes de flujo.

La siguiente tabla enumera y clasifica todas las clases proporcionadas por la biblioteca de entrada/salida.

Archivos de cabecera

Las clases de la biblioteca de entrada/salida residen en varios archivos de cabecera.

  • <ios>Contiene las definiciones de std::ios_baselas std::basic_iosclases que gestionan la información de formato y el búfer de flujo asociado.
  • <istream>Contiene la definición de la std::basic_istreamplantilla de clase, que implementa la entrada formateada.
  • <ostream>Contiene la definición de la std::basic_ostreamplantilla de clase, que implementa la salida formateada.
  • <iostream>Contiene la definición de std::basic_iostreamla plantilla de clase, que implementa la entrada y salida formateadas, e incluye <ios>, <istream>y <ostream>.
  • <fstream>Contiene las definiciones de std::basic_ifstreamplantillas std::basic_ofstreamde std::basic_fstreamclase que implementan entrada formateada, salida y entrada/salida en flujos de archivos.
  • <sstream>Contiene las definiciones de std::basic_istringstreamplantillas std::basic_ostringstreamde std::basic_stringstreamclase que implementan entrada formateada, salida y entrada/salida en flujos basados ​​en cadenas.
  • <iomanip>Contiene manipuladores de formato.
  • <iosfwd>Contiene declaraciones anticipadas de todas las clases de la biblioteca de entrada/salida.
  • <spanstream>proporciona dispositivos de entrada/salida y flujos mejorados para char[]. Estos utilizan un std::span<CharT>al búfer subyacente. Este encabezado reemplaza al anterior <strstream>.
  • <syncstream>Proporciona dispositivos de salida y flujos sincronizados.
  • <format>contiene funciones de formato como std::format()y la definición de clases formatter, range_formatter, etc. y concepto formattable.
  • <print>Contiene las funciones de impresión, que permiten imprimir cadenas formateadas en cualquier flujo de salida o archivo. Contiene std::print()y std::println(), donde std::println()se comporta de la misma manera que std::print(), excepto que cada impresión termina con una nueva línea adicional.

<strstream>se utilizaba para char[]dispositivos de entrada/salida y flujos. Fue reemplazado por el uso std::stringstreamdel <spanstream>encabezado y se eliminó en C++26 .

Búferes de flujo

En el lenguaje C++ se definen doce clases de búferes de flujo como la tabla.

Clases de apoyo

ios_basey basic_iosson dos clases que gestionan los bits de nivel inferior de un flujo. ios_basealmacena información de formato y el estado del flujo. basic_iosgestiona el búfer de flujo asociado. basic_iosse conoce comúnmente como simplemente ioso wios, que son dos definiciones de tipo para basic_ioscon un tipo de carácter específico. basic_iosy ios_baserara vez son utilizadas directamente por los programadores. Por lo general, se accede a su funcionalidad a través de otras clases como iostreamque las heredan. [ 9 ] [ 10 ]

Definiciones de tipos

Manipuladores de formato

flujos de entrada/salida

Los flujos de entrada/salida de C++ se definen principalmente mediante iostream, un archivo de cabecera que forma parte de la biblioteca estándar de C++ (el nombre significa Flujo de entrada/salida ) . En C++ y su predecesor, el lenguaje de programación C , no existe una sintaxis especial para la entrada o salida de datos en flujo. En su lugar, estos se combinan como una biblioteca de funciones . Al igual que la cabecera heredada de stdio.h de C , proporciona servicios básicos de entrada y salida para programas C++. iostream utiliza los objetos , , y para enviar datos hacia y desde los flujos estándar de entrada, salida, error (sin búfer) y registro (con búfer), respectivamente. Como parte de la biblioteca estándar de C++ , estos objetos forman parte del espacio de nombres . [ 11 ]cstdioiostreamcincoutcerrclogstd

El coutobjeto es de tipo ostream, que sobrecarga el operador de desplazamiento de bits izquierdo para que realice una operación completamente independiente de las operaciones bit a bit , y notablemente evalúa al valor del argumento izquierdo, lo que permite múltiples operaciones en el mismo objeto ostream, esencialmente como una sintaxis diferente para la cascada de métodos , exponiendo una interfaz fluida . Los objetos y también son de tipo , por lo que también sobrecargan ese operador. El objeto es de tipo , que sobrecarga el operador de desplazamiento de bits derecho. Las direcciones de los operadores de desplazamiento de bits hacen que parezca que los datos fluyen hacia el flujo de salida o fluyen desde el flujo de entrada.cerrclogostreamcinistream

formato de salida

Métodos

Manipuladores

Los manipuladores son objetos que pueden modificar un flujo utilizando los operadores <<OR .>>

Se pueden encontrar otros manipuladores utilizando el encabezado iomanip.

Crítica

Los manipuladores de formato deben "restablecerse" al final, o el programador verá sus efectos inesperadamente en la siguiente instrucció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 una configuración regional al compilar ostreamun programa, incluso si este nunca usa tipos (fecha, hora o moneda) que se vean afectados por dicha configuración, [ 12 ] y un programa "Hola, mundo!" enlazado estáticamente que utiliza GNU libstdc++ produce un ejecutable un orden de magnitud mayor que un programa equivalente que utiliza . [ 13 ] Existen implementaciones parciales de la biblioteca estándar de C++ diseñadas para entornos con limitaciones de espacio; estas implementaciones pueden omitir características que los programas en dichos entornos podrían no necesitar, como la compatibilidad con configuraciones regionales. [ 14 ]<iostream><cstdio><iostream>

Convenciones de nomenclatura

Ejemplos

El programa canónico "Hola, mundo!" anterior a C++23 que utilizaba la <iostream>biblioteca, se puede expresar de la siguiente manera:

#include <iostream>using std :: cout ; using std :: endl ;int main () { cout << "¡Hola, mundo!" << endl ; }

Este programa mostraría "¡Hola, mundo!" seguido de un salto de línea y el vaciado del búfer del flujo de salida estándar.

El siguiente ejemplo, que utiliza la <fstream>biblioteca, crea un archivo llamado ' file.txt ' e inserta en él el texto '¡Hola, mundo!' seguido de un salto de línea.

#include <fstream>using std :: endl ; using std :: ostream ;int main () { ofstream file ( "file.txt" ); file << "¡Hola, mundo!" << endl ; }

Utilizando la <print>biblioteca añadida en C++23 (que también es importada por el módulo de la biblioteca estándar std), el programa canónico "Hello, World!" posterior a C++23 se expresa como:

importar std ;int main () { std :: println ( "Hola, mundo!" ); }

Referencias

  1. ISO/IEC 14882:2003 Lenguajes de programación – C++. [lib.string.streams]/1
  2. Stanley B. Lippman, Josee Lajoie (1999). C++ Primer (tercera  ed.). Massachusetts: Addison-Wesley. pp. 1109–1112 . ISBN  0-201-82470-1.
  3. Bjarne Stroustrup (1997). El lenguaje de programación C++ (tercera ed.). Addison-Wesley. págs. 637–640 . ISBN   0-201-88954-4.
  4. Stanley B. Lippman, Josee Lajoie (1999). C++ Primer (tercera ed.). Massachusetts: Addison-Wesley. pp. 1063–1067 . ISBN   0-201-82470-1.
  5. Bjarne Stroustrup. "Una historia de C++: 1979-1991" (PDF) .
  6. Victor Zverovich (16 de julio de 2019). "Formato de texto" . open-std.org . WG 21.
  7. Victor Zverovich (25 de marzo de 2022). "Salida formateada" . open-std.org . WG 21.
  8. Victor Zverovich. "{fmt} - Una biblioteca de formato moderna" . fmt.dev . fmtlib . Consultado el 1 de diciembre de 2025 .
  9. Stanley B. Lippman, Josee Lajoie (1999). C++ Primer (tercera ed.). Massachusetts: Addison-Wesley. pp. 1112–1120 . ISBN   0-201-82470-1.
  10. "<ios> Visual Studio 2010" . Microsoft MSDN: Visual Studio 2010. Consultado el 28 de septiembre de 2011 .
  11. ^ Holzner, Steven (2001). C++ : Libro Negro . Scottsdale, Arizona: Grupo Coriolis. pag. 584.ISBN   1-57610-777-9. ...endl, que vacía el búfer de salida y envía un salto de línea al flujo de salida estándar.
  12. Código fuente de GNU libstdc++,bits/ios_base.h
  13. C++ vs. C – Pin ocho
  14. "Biblioteca C++ uClibc++" . Consultado el 6 de enero de 2012 .
  • Referencia de C++ para la biblioteca de entrada/salida
  • Iostreams de la biblioteca estándar de Apache C++
  • Tutorial completo sobre cómo formatear la salida en C++.
Obtenido de " https://en.wikipedia.org/w/index.php?title=C%2B%2B_input/output_library&oldid=1356467258#Input/output_streams "