Namespaces
Variants

std:: FILE

From cppreference.net
< cpp ‎ | io ‎ | c
Definido en el encabezado <cstdio>
typedef /* unspecified */ FILE ;

Cada std::FILE objeto denota un flujo C.

El estándar de C (referenciado por el estándar de C++) no especifica si std::FILE es un tipo de objeto completo. Aunque podría ser posible copiar un std::FILE válido, usar un puntero a dicha copia como argumento para una función de E/S invoca comportamiento no especificado. En otras palabras, std::FILE puede ser semánticamente no copiable.

Los flujos de E/S pueden utilizarse tanto para entrada y salida con formato como sin formato. Además, las funciones que manejan entrada y salida también pueden ser sensibles a la configuración regional, de modo que se realizan conversiones de caracteres anchos/multibyte según sea necesario.

Contenidos

Estado del flujo

Además de la información específica del sistema necesaria para acceder al dispositivo ( p. ej., un descriptor de archivo POSIX), cada objeto std::FILE contiene directa o indirectamente lo siguiente:

  1. Ancho de carácter: no establecido, estrecho o ancho.
  2. Estado de análisis para conversiones entre caracteres multibyte y anchos (un objeto de tipo std::mbstate_t )
  3. Estado de búfer: sin búfer, con búfer por línea, con búfer completo.
  4. El búfer, que puede ser reemplazado por un búfer externo proporcionado por el usuario.
  5. Modo E/S: entrada, salida o actualización (entrada y salida).
  6. Indicador de modo binario/texto.
  7. Indicador de estado de fin de archivo.
  8. Indicador de estado de error.
  9. Indicador de posición de archivo, accesible como un objeto de tipo std::fpos_t , que, para flujos anchos, incluye el estado de análisis.
  10. (C++17) Bloqueo reentrante utilizado para prevenir condiciones de carrera cuando múltiples hilos leen, escriben, posicionan o consultan la posición de un flujo.

Orientación estrecha y amplia

Un flujo recién abierto no tiene orientación. La primera llamada a std::fwide o a cualquier función de E/S establece la orientación: una función de E/S ancha hace que el flujo sea de orientación ancha; una función de E/S estrecha hace que el flujo sea de orientación estrecha. Una vez establecida, la orientación solo puede cambiarse con std::freopen . Las funciones de E/S estrechas no pueden llamarse en un flujo de orientación ancha; las funciones de E/S anchas no pueden llamarse en un flujo de orientación estrecha. Las funciones de E/S anchas convierten entre caracteres anchos y multibyte como si llamaran a std::mbrtowc o std::wcrtomb con el estado de conversión descrito por el flujo. A diferencia de las cadenas de caracteres multibyte que son válidas en un programa, las secuencias de caracteres multibyte en el archivo pueden contener nulos incrustados y no tienen que comenzar o terminar en el estado de desplazamiento inicial.

El estado de conversión de un flujo con orientación ancha se establece mediante la configuración regional C que está instalada en el momento en que se establece la orientación del flujo.

Modos binario y texto

Un flujo de texto es una secuencia ordenada de caracteres que puede componerse en líneas; una línea puede descomponerse en cero o más caracteres más un carácter de terminación ' \n ' ("nueva línea"). Si la última línea requiere un carácter de terminación ' \n ' está definido por la implementación. Además, puede ser necesario agregar, alterar o eliminar caracteres en la entrada y salida para ajustarse a las convenciones de representación de texto en el SO (en particular, los flujos de C en Windows convierten ' \n ' a ' \r \n ' en la salida, y convierten ' \r \n ' a ' \n ' en la entrada).

Los datos leídos desde un flujo de texto se garantiza que compararán iguales con los datos que se escribieron anteriormente en ese flujo solo si se cumple cada una de las siguientes condiciones:

  • Los datos consisten únicamente en caracteres imprimibles y/o los caracteres de control ' \t ' y ' \n ' (en particular, en Windows OS, el carácter ' \0 x1A' termina la entrada).
  • Ningún ' \n ' está inmediatamente precedido por caracteres de espacio (dichos espacios pueden desaparecer cuando esta salida se lea posteriormente como entrada).
  • El último carácter es ' \n ' .

Un flujo binario es una secuencia ordenada de caracteres que puede registrar datos internos de manera transparente. Los datos leídos desde un flujo binario siempre son iguales a los datos que previamente se escribieron en ese flujo, excepto que una implementación puede agregar un número indeterminado de caracteres nulos al final del flujo. Un flujo binario ancho no necesita terminar en el estado de desplazamiento inicial.

Notas

POSIX exige explícitamente que la faceta LC_CTYPE de la configuración regional C actualmente instalada se almacene dentro del objeto FILE en el momento en que la orientación del flujo se vuelve ancha; POSIX requiere que esta faceta LC_CTYPE se utilice para todas las operaciones de E/S futuras en este flujo hasta que se cambie la orientación, independientemente de cualquier llamada posterior a std::setlocale .

Se pretende que cada línea de texto esté compuesta de datos que sean esencialmente legibles para humanos. Las implementaciones POSIX no distinguen entre flujos de texto y binarios (no hay un mapeo especial para ' \n ' o cualquier otro carácter).

Véase también

abstrae un dispositivo sin procesar
(plantilla de clase)
implementa dispositivo de archivo sin procesar
(plantilla de clase)
expresión de tipo FILE * asociada con el flujo de entrada
expresión de tipo FILE * asociada con el flujo de salida
expresión de tipo FILE * asociada con el flujo de salida de error
(constante macro)