El lenguaje de programación C proporciona muchas funciones de biblioteca estándar para la entrada y salida de archivos . Estas funciones constituyen la mayor parte del encabezado de la biblioteca estándar de C
La funcionalidad de E / S de C es de nivel bastante bajo según los estándares modernos; C abstrae todas las operaciones de archivo en operaciones sobre flujos de bytes , que pueden ser "flujos de entrada" o "flujos de salida". A diferencia de algunos lenguajes de programación anteriores, C no tiene soporte directo para archivos de datos de acceso aleatorio ; Para leer de un registro en medio de un archivo, el programador debe crear una secuencia, buscar en la mitad del archivo y luego leer bytes en secuencia de la secuencia.
El modelo de flujo de E / S de archivos fue popularizado por Unix, que se desarrolló al mismo tiempo que el propio lenguaje de programación C. La gran mayoría de los sistemas operativos modernos han heredado flujos de Unix, y muchos lenguajes de la familia de lenguajes de programación C han heredado la interfaz de E / S de archivos de C con pocos o ningún cambio (por ejemplo, PHP ).
Descripción general
Esta biblioteca utiliza lo que se denomina streams para operar con dispositivos físicos como teclados, impresoras, terminales o con cualquier otro tipo de archivos admitidos por el sistema. Los arroyos son una abstracción para interactuar con estos de manera uniforme. Todos los flujos tienen propiedades similares independientemente de las características individuales de los medios físicos con los que están asociados. [4]
Funciones
La mayoría de las funciones de entrada / salida de archivos C se definen en
Carácter de byte | Carácter amplio | Descripción | |
---|---|---|---|
Acceso a archivos | fopen | Abre un archivo (con un nombre de archivo que no es Unicode en Windows y un posible nombre de archivo UTF-8 en Linux) | |
freopen | Abre un archivo diferente con una secuencia existente | ||
enjuagar | Sincroniza un flujo de salida con el archivo real | ||
fcerrar | Cierra un archivo | ||
setbuf | Establece el búfer para una secuencia de archivos | ||
setvbuf | Establece el búfer y su tamaño para una secuencia de archivos. | ||
amplio | Cambia una secuencia de archivos entre E / S de caracteres anchos y E / S de caracteres estrechos | ||
Entrada / salida directa | fread | Lee de un archivo | |
escribir | Escribe en un archivo | ||
Entrada / salida sin formato | fgetc getc | fgetwc getwc | Lee un byte / wchar_t de una secuencia de archivos |
fgets | fgetws | Lee un byte / wchar_t línea de una secuencia de archivo | |
fputc putc | fputwc putwc | Escribe un byte / wchar_t a una secuencia de archivos | |
fputs | fputws | Escribe un byte / wchar_t cadena a una secuencia de archivo | |
getchar | getwchar | Lee un byte / wchar_t de stdin | |
N / A | Lee una cadena de bytes de stdin hasta que se encuentra una nueva línea o el final del archivo (obsoleto en C99, eliminado de C11) | ||
putchar | putwchar | Escribe un byte / wchar_t a stdout | |
pone | N / A | Escribe una cadena de bytes en stdout | |
ungetc | ungetwc | Pone un byte / wchar_t de nuevo en una secuencia de archivos | |
Entrada / salida formateada | scanf fscanf sscanf | wscanf fwscanf swscanf | Lee el byte formateado / wchar_t entrada de stdin, una secuencia de archivo o un búfer |
vscanf vfscanf vsscanf | vwscanf vfwscanf vswscanf | Lee el byte de entrada formateado / wchar_t de stdin, un flujo de archivo o un búfer usando la lista de argumentos de variable | |
printf fprintf sprintf snprintf | wprintf fwprintf swprintf | Imprime con formato byte / wchar_t salida a stdout, una secuencia de archivo o un búfer | |
vprintf vfprintf vsprintf vsnprintf | vwprintf vfwprintf vswprintf | Imprime con formato byte / wchar_t salida a stdout, una secuencia de archivo o un búfer usando la lista de argumentos de variable | |
perror | N / A | Escribe una descripción del error actual en stderr | |
Posicionamiento de archivos | ftell ftello | Devuelve el indicador de posición del archivo actual | |
fseek fseeko | Mueve el indicador de posición del archivo a una ubicación específica en un archivo | ||
fgetpos | Obtiene el indicador de posición del archivo | ||
fsetpos | Mueve el indicador de posición del archivo a una ubicación específica en un archivo | ||
rebobinar | Mueve el indicador de posición de archivo al principio de un archivo | ||
Manejo de errores | mas claro | Borra errores | |
feof | Comprueba el final del archivo | ||
ferror | Comprueba si hay un error de archivo | ||
Operaciones en archivos | retirar | Borra un archivo | |
rebautizar | Cambia el nombre de un archivo | ||
tmpfile | Devuelve un puntero a un archivo temporal. | ||
tmpnam | Devuelve un nombre de archivo único |
Constantes
Constantes definidas en el El encabezado
Nombre | Notas |
---|---|
EOF | Un número entero negativo de tipo int usado para indicar condiciones de fin de archivo |
BUFSIZ | Un número entero que es el tamaño del búfer utilizado por el setbuf () función |
FILENAME_MAX | El tamaño de un char matriz que es lo suficientemente grande como para almacenar el nombre de cualquier archivo que se pueda abrir |
FOPEN_MAX | La cantidad de archivos que pueden estar abiertos simultáneamente; Serán al menos ocho |
_IOFBF | Abreviatura de "entrada / salida con búfer completo"; es un número entero que se puede pasar al Función setvbuf () para solicitar entrada y salida en búfer de bloque para una secuencia abierta |
_IOLBF | Abreviatura de "línea de entrada / salida almacenada en búfer"; es un número entero que se puede pasar al función setvbuf () para solicitar entrada y salida almacenada en búfer de línea para una secuencia abierta |
_IONBF | Abreviatura de "entrada / salida sin búfer"; es un número entero que se puede pasar al función setvbuf () para solicitar entrada y salida sin búfer para una secuencia abierta |
L_tmpnam | El tamaño de un char matriz que es lo suficientemente grande para almacenar un nombre de archivo temporal generado por el tmpnam () función |
NULO | Una macro que se expande a la constante de puntero nulo ; es decir, una constante que representa un valor de puntero que se garantiza que no es una dirección válida de un objeto en la memoria |
SEEK_CUR | Un número entero que se puede pasar al Función fseek () para solicitar el posicionamiento relativo a la posición actual del archivo |
SEEK_END | Un número entero que se puede pasar al Función fseek () para solicitar posicionamiento relativo al final del archivo |
SEEK_SET | Un número entero que se puede pasar al Función fseek () para solicitar el posicionamiento relativo al comienzo del archivo |
TMP_MAX | El número máximo de nombres de archivo únicos que puede generar el función tmpnam () ; tendrá al menos 25 |
Variables
Variables definidas en el El encabezado
Nombre | Notas |
---|---|
stdin | Un puntero a un ARCHIVO que se refiere al flujo de entrada estándar, generalmente un teclado. |
stdout | Un puntero a un ARCHIVO que se refiere al flujo de salida estándar, generalmente un terminal de pantalla. |
stderr | Un puntero a un ARCHIVO que se refiere al flujo de errores estándar, a menudo un terminal de pantalla. |
Tipos de miembros
Tipos de datos definidos en el El encabezado
- ARCHIVO - también conocido comoidentificador de archivo , este es un tipo opaco que contiene la información sobre un archivo o secuencia de texto necesaria para realizar operaciones de entrada o salida en él, que incluyen:
- identificador específico de la plataforma del dispositivo de E / S asociado, como un descriptor de archivo
- el búfer
- indicador de orientación de la corriente (desarmado, estrecho o ancho)
- indicador de estado de almacenamiento en búfer de flujo (sin búfer, búfer de línea, búfer completo)
- Indicador de modo de E / S (flujo de entrada, flujo de salida o flujo de actualización)
- indicador de modo binario / texto
- indicador de fin de archivo
- indicador de error
- la posición actual de la secuencia y el estado de conversión multibyte (un objeto de tipo mbstate_t)
- cerradura reentrante (requerida a partir de C11 )
- fpos_t : un tipo que no es una matriz capaz de identificar de manera única la posición de cada byte en un archivo y cada estado de conversión que puede ocurrir en todas las codificaciones de caracteres multibyte admitidas
- size_t - un tipo entero sin signo que es el tipo del resultado de la tamaño del operador.
Extensiones
El estándar POSIX define varias extensiones para stdio en sus Definiciones Base, entre las que se encuentran función readline que asigna memoria, la fileno y fdopen funciones que establecen el vínculo entre ARCHIVO objetos y descriptores de archivo , y un grupo de funciones para crear Objetos FILE que se refieren a búferes en memoria. [5]
Ejemplo
El siguiente programa en C abre un archivo binario llamado myfile , lee cinco bytes y luego cierra el archivo.
#include #include int principal ( void ) { Char tampón [ 5 ]; ARCHIVO * fp = fopen ( "miarchivo" , "rb" ); if ( fp == NULL ) { perror ( "No se pudo abrir el archivo \" myfile \ " " ); return EXIT_FAILURE ; } para ( int i = 0 ; i < 5 ; i ++ ) { int rc = getc ( fp ); if ( rc == EOF ) { fputs ( "Ocurrió un error al leer el archivo. \ n " , stderr ); return EXIT_FAILURE ; } tampón [ i ] = rc ; } fclose ( fp ); printf ( "Los bytes leídos fueron ...% x% x% x% x% x \ n " , búfer [ 0 ], búfer [ 1 ], búfer [ 2 ], búfer [ 3 ], búfer [ 4 ]); return EXIT_SUCCESS ; }
Alternativas a stdio
Varias alternativas a stdio han sido desarrollados. Entre estos se encuentra el C ++ biblioteca iostream , parte del estándar ISO C ++ . ISO C ++ todavía requiere el funcionalidad stdio .
Otras alternativas incluyen la biblioteca SFIO [6] (A Safe / Fast I / O Library) de AT&T Bell Laboratories . Esta biblioteca, introducida en 1991, tenía como objetivo evitar inconsistencias, prácticas inseguras e ineficiencias en el diseño de stdio . Entre sus características está la posibilidad de insertar funciones de devolución de llamada en un flujo para personalizar el manejo de los datos leídos o escritos en el flujo. [7] Fue lanzado al mundo exterior en 1997, y el último lanzamiento fue 20050201. [8]
Ver también
- cadena de formato printf
- cadena de formato scanf
Referencias
- ^ Especificación ISO / IEC 9899: 1999 (PDF) . pag. 274, párrafo 7.19.
- ^ Kernighan, Brian ; Pike, Rob (1984). El entorno de programación UNIX . Acantilados de Englewood : Prentice Hall . pag. 200.
- ^ McIlroy, MD (1987). Un lector de investigación Unix: extractos comentados del Manual del programador, 1971–1986 (PDF) (Informe técnico). CSTR. Bell Labs. 139.
- ^ http://www.cplusplus.com/reference/cstdio/
- ^ - Referencia de definiciones de base, la especificación única de UNIX , número 7 de The Open Group
- ^ "SFIO: una biblioteca de E / S segura / rápida" . Archivado desde el original el 11 de febrero de 2006 . Consultado el 16 de marzo de 2021 .CS1 maint: bot: estado de URL original desconocido ( enlace )
- ^ Korn, David G .; Vo, Kiem-Phong (1991). SFIO: E / S segura / rápida de cadenas / archivos . Proc. Verano USENIX Conf. CiteSeerX 10.1.1.51.6574 .
- ^ Fowler, Glenn S .; Korn, David G .; Vo, Kiem-Phong (2000). Formateo extendido con Sfio . Proc. Verano USENIX Conf.
enlaces externos
- Medios relacionados con la entrada / salida de archivos C en Wikimedia Commons