std::FILE
Definido en el archivo de encabezado <cstdio>
|
||
typedef /* no especificado */ FILE; |
||
Cada objeto std::FILE
denota flujo de C.
El estándar de C (al que hace referencia el estándar de C++) no especifica si std::FILE
es un tipo de objeto completo. Si bien es posible copiar un std::FILE
válido, usar un puntero a dicha copia como argumento para una función de E/S invoca un comportamiento no especificado. En otras palabras, std::FILE
puede ser semánticamente no copiable.
Los flujos de E/S se pueden utilizar para entrada y salida formateada y sin formato. Además, las funciones que manejan la entrada y la salida también pueden ser sensibles a la configuración regional, de modo que las conversiones de ancho/multibyte se realicen según sea necesario.
Contenido |
[editar] Estado del flujo
Además de la información específica del sistema necesaria para acceder al dispositivo (por ejemplo, un descriptor de archivo POSIX), cada objeto std::FILE
directa o indirectamente contiene lo siguiente:
- Ancho de carácter: sin configurar, estrecho o ancho.
- Estado de análisis para conversiones entre multibyte y caracteres anchos (un objeto de tipo std::mbstate_t).
- Estado de búfer: sin búfer, con búfer de línea, con búfer completo.
- El búfer, que puede ser reemplazado por un búfer externo proporcionado por el usuario.
- Modo de E/S: entrada, salida o actualización (tanto de entrada como de salida).
- Indicador de modo binario/texto.
- Indicador de estado de fin de archivo.
- Indicador de estado de error.
- Indicador de posición del archivo, accesible como un objeto de tipo std::fpos_t, que, para flujos anchos, incluye el estado de análisis.
- (C++17) Cerrojo de reentrada utilizado para evitar carreras de datos cuando varios hilos leen, escriben, posicionan o consultan la posición de un flujo.
[editar] Orientación angosta y ancha
Un flujo recién abierto no tiene orientación. La primera llamada a std::fwide o a cualquier función E/S establece la orientación: una función de E/S ancha hace que el flujo tenga una orientación ancha; una función de E/S estrecha hace que el flujo tenga una orientación estrecha. Una vez establecida, la orientación se puede cambiar solo con std::freopen. Las funciones de E/S estrechas no se pueden llamar en un flujo de orientación ancha; las funciones de E/S anchas no se pueden llamar 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 como se describe 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 valores nulos incrustados y no es necesario que comiencen o terminen en el estado de cambio inicial.
El estado de conversión de un flujo con orientación ancha se establece mediante la configuración regional de C que se instala en el momento en que se establece la orientación del flujo.
[editar] Modos binario y de texto
Un flujo de texto es una secuencia ordenada de caracteres que se pueden componer en líneas; una línea se puede descomponer en cero o más caracteres más un carácter de terminación '\n' (“newline”). Si la última línea requiere una terminación '\n', está definido por la implementación. Además, es posible que se deban agregar, modificar o eliminar caracteres en la entrada y la salida para cumplir con las convenciones para representar texto en el sistema operativo (en particular, los flujos de C en el sistema operativo Windows convierten '\n' a { {c|'\r\n'}} en la salida y convierten '\r\n' a '\n' en la entrada).
Se garantiza que los datos leídos de un flujo de texto se comparan iguales con los datos que se escribieron anteriormente en ese flujo solo si se cumple cada uno de los siguientes:
- Los datos consisten únicamente en caracteres de impresión y/o los caracteres de control '\t' y '\n' (en particular, en el sistema operativo Windows, el carácter ' \0x1A' termina la entrada).
- Ningún carácter '\n' está inmediatamente precedido por caracteres de espacio (dichos caracteres de espacio pueden desaparecer cuando dicha salida se lee más tarde como entrada).
- El último carácter es '\n'.
Un flujo binario es una secuencia ordenada de caracteres que puede registrar datos internos de forma transparente. Los datos leídos de un flujo binario siempre son iguales a los datos que se escribieron anteriormente en ese flujo, excepto que se permite que una implementación agregue un número indeterminado de caracteres nulos al final del flujo. Un flujo binario ancho no necesita terminar en el estado de cambio inicial.
[editar] Notas
POSIX requiere explícitamente que la faceta LC_CTYPE
de la configuración regional de C actualmente instalada se almacene dentro del objeto FILE
en el momento en que la orientación del flujo se vuelva ancha; POSIX requiere que esta faceta LC_CTYPE
se use para todas la E/S futura 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 se componga de datos que sean esencialmente legibles por humanos. Las implementaciones de POSIX no distinguen entre flujos de texto y binarios (no hay una correspondencia especial para '\n' o cualquier otro carácter).
[editar] Véase también
Abstrae un dispositivo puro. (plantilla de clase) | |
Implementa un dispositivo de archivo puro. (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 error. (constante de macro) | |
Documentación de C para FILE
|