Entrada / salida de archivo C - C file input/output

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 <stdio.h> . La funcionalidad desciende de un "paquete de E / S portátil" escrito por Mike Lesk en Bell Labs a principios de la década de 1970, y se convirtió oficialmente en parte del sistema operativo Unix en la Versión 7 .

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 ).

Visió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.

Funciones

La mayoría de las funciones de entrada / salida de archivos C se definen en <stdio.h> (o en el encabezado C ++ cstdio , que contiene la funcionalidad estándar de C pero en el espacio de nombres estándar ).


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 archivo
fgets fgetws Lee una línea byte / wchar_t de una secuencia de archivo
fputc
putc
fputwc
putwc
Escribe un byte / wchar_t en una secuencia de archivo
fputs fputws Escribe una cadena de bytes / wchar_t en una secuencia de archivo
getchar getwchar Lee un byte / wchar_t de stdin
obtiene 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 en stdout
pone N / A Escribe una cadena de bytes en stdout
ungetc ungetwc Vuelve a colocar un byte / wchar_t en una secuencia de archivo

Entrada / salida formateada
scanf
fscanf
sscanf
wscanf
fwscanf
swscanf
Lee la entrada con formato byte / wchar_t 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,
una secuencia de archivo o un búfer usando la lista de argumentos de variable
printf
fprintf
sprintf
snprintf
wprintf
fwprintf
swprintf
Imprime la salida con formato byte / wchar_t en stdout,
un flujo de archivo o un búfer
vprintf
vfprintf
vsprintf
vsnprintf
vwprintf
vfwprintf
vswprintf
Imprime la salida con formato byte / wchar_t en 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

Las constantes definidas en el encabezado <stdio.h> incluyen:

Nombre Notas
EOF Un entero negativo de tipo int que se usa para indicar condiciones de fin de archivo.
BUFSIZ Un número entero que es el tamaño del búfer utilizado por la función setbuf ()
FILENAME_MAX El tamaño de un carbón matriz que es lo suficientemente grande para almacenar el nombre de cualquier archivo que se puede 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 a la 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 a la función setvbuf () para solicitar la 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 a la 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 suficiente para almacenar un nombre de archivo temporal generado por el gran 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 a la función fseek () para solicitar el posicionamiento en relación con la posición actual del archivo.
SEEK_END Un número entero que se puede pasar a la función fseek () para solicitar el posicionamiento relativo al final del archivo.
SEEK_SET Un número entero que se puede pasar a la 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 la función tmpnam () ; tendrá al menos 25

Variables

Stdstreams-notitle.svg

Las variables definidas en el encabezado <stdio.h> incluyen:

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 error estándar, a menudo un terminal de pantalla.

Tipos de miembros

Los tipos de datos definidos en el encabezado <stdio.h> incluyen:

  • 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 de entero sin signo que es el tipo del resultado del operador sizeof .

Extensiones

El estándar POSIX define varias extensiones a stdio en sus Definiciones Base, entre las que se encuentran una función readline que asigna memoria, las funciones fileno y fdopen que establecen el vínculo entre los objetos FILE y los descriptores de archivos , y un grupo de funciones para crear objetos FILE que hacen referencia a búferes en memoria.

Ejemplo

El siguiente programa en C abre un archivo binario llamado myfile , lee cinco bytes y luego cierra el archivo.

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    char buffer[5];
    FILE* fp = fopen("myfile", "rb");

    if (fp == NULL) {
        perror("Failed to open file \"myfile\"");
        return EXIT_FAILURE;
    }

    for (int i = 0; i < 5; i++) {
        int rc = getc(fp);
        if (rc == EOF) {
            fputs("An error occurred while reading the file.\n", stderr);
            return EXIT_FAILURE;
        }
        
        buffer[i] = rc;
    }

    fclose(fp);

    printf("The bytes read were... %x %x %x %x %x\n", buffer[0], buffer[1],
        buffer[2], buffer[3], buffer[4]);

    return EXIT_SUCCESS;
}

Alternativas a stdio

Se han desarrollado varias alternativas a stdio . Entre estos se encuentra la biblioteca iostream de C ++ , parte del estándar ISO C ++ . ISO C ++ todavía requiere la funcionalidad stdio .

Otras alternativas incluyen la biblioteca SFIO (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. Fue lanzado al mundo exterior en 1997 y el último lanzamiento fue el 1 de febrero de 2005.

Ver también

Referencias

enlaces externos