Namespaces
Variants

FILE

From cppreference.net
< c ‎ | io
Definido en el encabezado <stdio.h>
typedef /* no especificado */ FILE ;

Cada FILE objeto denota un flujo C.

El estándar de C no especifica si FILE es un tipo de objeto completo. Aunque puede ser posible copiar un 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, 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 FILE contiene directa o indirectamente lo siguiente:

  1. (C95) Ancho de caracteres: no establecido, estrecho o ancho.
  2. (C95) Estado de análisis para conversiones entre caracteres multibyte y anchos (un objeto de tipo mbstate_t )
  3. Estado de búfer: sin búfer, con búfer de 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 de 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 fpos_t , que, para flujos anchos, incluye el estado de análisis.
  10. (C11) 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 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 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 mbrtowc o 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 (tales caracteres de espacio pueden desaparecer cuando dicha salida se lee 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 equivalen 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 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 existe un mapeo especial para ' \n ' o cualquier otro carácter).

Referencias

  • Estándar C17 (ISO/IEC 9899:2018):
  • 7.21 Entrada/salida <stdio.h> (p: 217-247)
  • 7.29 Utilidades extendidas de caracteres multibyte y anchos <wchar.h> (p: 295-325)
  • Estándar C11 (ISO/IEC 9899:2011):
  • 7.21 Entrada/salida <stdio.h> (p: 296-339)
  • 7.29 Utilidades extendidas de caracteres multibyte y anchos <wchar.h> (p: 402-446)
  • Estándar C99 (ISO/IEC 9899:1999):
  • 7.19 Entrada/salida <stdio.h> (p: 262-305)
  • 7.24 Utilidades extendidas de caracteres multibyte y anchos <wchar.h> (p: 348-392)
  • Estándar C89/C90 (ISO/IEC 9899:1990):
  • 4.9 ENTRADA/SALIDA <stdio.h>

Véase también

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)