E/S de archivos C: crear, abrir, leer, escribir y cerrar un archivo

⚡ Resumen inteligente

El manejo de archivos en C almacena datos persistentes en el disco a través de la biblioteca stdio, que abre un archivo con fopen, escribe con fputc, fputs o fprintf, lee con fgetc, fgets o fscanf y lo cierra usando fclose.

  • 📁 Modos de archivo: La cadena de modo que se pasa a fopen — r, w, a, r+, w+ o a+ — decide si un archivo se lee, se sobrescribe o se le añade contenido.
  • ✍️ Escritura de datos: fputc escribe un carácter, fputs escribe una cadena y fprintf escribe texto formateado en el puntero del archivo.
  • Línea Leyendo datos: fgetc lee un carácter, fgets lee una línea en un búfer y fscanf analiza tokens formateados del archivo.
  • 🔒 Cerrando archivos: fclose vacía los datos almacenados en búfer y libera el archivo, devolviendo 0 si tiene éxito y EOF si falla.
  • 🔁 E/S interactiva: Las funciones getc y putc procesan un solo carácter a la vez, transfiriendo la entrada directamente a un archivo y luego devolviéndola.
  • 🤖 Asistencia de IA: GitHub Copilot y los asistentes de IA generan rutinas para fopen, fprintf y fgets, e indican la falta de comprobaciones de valores nulos o archivos sin cerrar.

E/S de archivos C

C Gestión de archivos

Un archivo se puede utilizar para almacenar un gran volumen de datos persistentes. Al igual que muchos otros lenguajes, 'C' proporciona la siguiente gestión de archivos. funciones,

  1. Creación de un archivo
  2. Abrir un archivo
  3. Leer un archivo
  4. Escribir en un archivo
  5. Cerrar un archivo

A continuación se presentan las funciones de administración de archivos más importantes disponibles en 'C',

función propósito
abrir () Crear un archivo o abrir un archivo existente
cerrar () Cerrar un archivo
fprintf() Escribir un bloque de datos en un archivo
fscanf() Leer un bloque de datos de un archivo
obtenerc() Lee un solo carácter de un archivo
putc () Escribe un solo carácter en un archivo.
obtener W () Lee un número entero de un archivo
poner () Escribir un número entero en un archivo
buscar () Establece la posición de un puntero de archivo en una ubicación especificada
ftell () Devuelve la posición actual de un puntero de archivo.
rebobinar () Establece el puntero del archivo al principio de un archivo.

Cómo crear un archivo

Siempre que desee trabajar con un archivo, el primer paso es crear un archivo. Un archivo no es más que espacio en una memoria donde se almacenan datos.

Para crear un archivo en un programa en 'C' se utiliza la siguiente sintaxis:

FILE *fp;
fp = fopen ("file_name", "mode");

En la sintaxis anterior, el archivo es una estructura de datos definida en la biblioteca estándar.

fopen es una función estándar que se utiliza para abrir un archivo.

  • Si el archivo no está presente en el sistema, se crea y luego se abre.
  • Si el archivo ya está presente en el sistema, se abrirá directamente mediante esta función.

fp es un archivo puntero que apunta al tipo de archivo.

Siempre que abra o cree un archivo, debe especificar qué va a hacer con él. En la programación en "C", se puede crear o abrir un archivo con fines de lectura o escritura. Se utiliza un modo para especificar si desea abrir un archivo para cualquiera de los fines que se indican a continuación. A continuación, se presentan los diferentes tipos de modos en la programación en "C" que se pueden utilizar al trabajar con un archivo.

Modo de archivo Mareas Ideales para Lecciones
r Abra un archivo para leer. Si un archivo está en modo de lectura, no se eliminan datos si un archivo ya está presente en un sistema.
w Abra un archivo para escribir. Si un archivo está en modo de escritura, se crea un nuevo archivo si no existe en absoluto. Si un archivo ya está presente en un sistema, todos los datos dentro del archivo se truncan y se abre para fines de escritura.
a Abrir un archivo en modo de adición. Si un archivo está en modo de adición, se abrirá. El contenido del archivo no se modificará.
r+ Abierto para leer y escribir desde el principio.
w+ abierto para lectura y escritura, sobrescribiendo un archivo
a+ abierto para lectura y escritura, anexando al archivo

En la sintaxis dada, el nombre del archivo y el modo se especifican como instrumentos de cuerda Por lo tanto, siempre deben ir entre comillas dobles.

Por ejemplo:

#include <stdio.h>
int main() {
FILE *fp;
fp  = fopen ("data.txt", "w");
}

Salida:

El archivo se crea en la misma carpeta donde guardó su código.

Crear un archivo en la salida de un programa C

Puede especificar la ruta donde desea crear su archivo.

#include <stdio.h>
int main() {
FILE *fp;
fp  = fopen ("D://data.txt", "w");
}

Crear un archivo con una ruta específica en C

Cómo cerrar un archivo

Siempre se debe cerrar un archivo cuando finalizan las operaciones en él. Esto significa que se cancelan el contenido y los vínculos al archivo. Esto evita que se dañe accidentalmente el archivo.

'C' proporciona la función fclose para realizar la operación de cierre de archivos. La sintaxis de fclose es la siguiente:

fclose (file_pointer);

Por ejemplo:

FILE *fp;
fp  = fopen ("data.txt", "r");
fclose (fp);

La función fclose recibe como argumento un puntero de archivo. El archivo asociado a dicho puntero se cierra mediante la función fclose. Devuelve 0 si el cierre se realizó correctamente y EOF (fin de archivo) si se produjo un error durante el proceso.

Después de cerrar el archivo, el mismo puntero de archivo también se puede utilizar con otros archivos.

En la programación 'C', los archivos se cierran automáticamente cuando finaliza el programa. Cerrar un archivo manualmente escribiendo la función fclose es una buena práctica de programación.

Escribir en un archivo

En C, cuando escribe en un archivo, se deben agregar explícitamente los caracteres de nueva línea "\n".

La biblioteca stdio ofrece las funciones necesarias para escribir en un archivo:

  • fputc(char, file_pointer): Escribe un carácter en el archivo al que apunta file_pointer.
  • fputs(str, file_pointer): Escribe una cadena en el archivo al que apunta file_pointer.
  • fprintf(file_pointer, str, variable_lists): Imprime una cadena en el archivo al que apunta file_pointer. La cadena puede incluir opcionalmente especificadores de formato y una lista de variables variable_lists.

El siguiente programa muestra cómo realizar la escritura en un archivo:

Función fputc():

#include <stdio.h>
int main() {
        int i;
        FILE * fptr;
        char fn[50];
        char str[] = "Guru99 Rocks\n";
        fptr = fopen("fputc_test.txt", "w"); // "w" defines "writing mode"
        for (i = 0; str[i] != '\n'; i++) {
            /* write to file using fputc() function */
            fputc(str[i], fptr);
        }
        fclose(fptr);
        return 0;
    }

Salida:

Salida de la función fputc() en C

El programa anterior escribe un solo carácter en el archivo fputc_test.txt hasta que encuentra el símbolo de siguiente línea "\n", que indica que la frase se escribió correctamente. El proceso consiste en tomar cada carácter del array y escribirlo en el archivo.

Contenido del archivo fputc_test.txt escrito en C

  1. En el programa anterior, creamos y abrimos un archivo llamado fputc_test.txt en modo de escritura y declaramos nuestra cadena que se escribirá en el archivo.
  2. Realizamos una operación de escritura carácter por carácter usando un bucle for y colocamos cada carácter en nuestro archivo hasta que se encuentra el carácter “\n”, luego el archivo se cierra usando la función fclose.

fputs() Función:

#include <stdio.h>
int main() {
        FILE * fp;
        fp = fopen("fputs_test.txt", "w+");
        fputs("This is Guru99 Tutorial on fputs,", fp);
        fputs("We don't need to use for loop\n", fp);
        fputs("Easier than fputc function\n", fp);
        fclose(fp);
        return (0);
    }

Salida:

Salida de la función fputs() en C

Contenido del archivo fputs_test.txt en C

  1. En el programa anterior, hemos creado y abierto un archivo llamado fputs_test.txt en modo de escritura.
  2. Después de realizar una operación de escritura utilizando la función fputs() escribiendo tres cadenas diferentes
  3. Luego el archivo se cierra usando la función fclose.

fprintf()Función:

#include <stdio.h>
    int main() {
        FILE *fptr;
        fptr = fopen("fprintf_test.txt", "w"); // "w" defines "writing mode"
        /* write to file */
        fprintf(fptr, "Learning C with Guru99\n");
        fclose(fptr);
        return 0;
    }

Salida:

Salida de la función fprintf() en C

Contenido del archivo fprintf_test.txt en C

  1. En el programa anterior hemos creado y abierto un archivo llamado fprintf_test.txt en modo de escritura.
  2. Después de realizar una operación de escritura utilizando la función fprintf() escribiendo una cadena, el archivo se cierra utilizando la función fclose.

Leer datos de un archivo

Hay tres funciones diferentes dedicadas a leer datos de un archivo.

  • fgetc(file_pointer): Devuelve el siguiente carácter del archivo al que apunta el puntero de archivo. Cuando se alcanza el final del archivo, se envía el EOF.
  • fgets(buffer, n, file_pointer): Lee n-1 caracteres del archivo y almacena la cadena en un búfer en el que el carácter NULL '\0' se agrega como último carácter.
  • fscanf(file_pointer, conversion_specifiers, variable_adresses): Se utiliza para analizar datos. Lee caracteres del archivo y asigna la entrada a una lista de punteros a variables (variable_adresses) mediante especificadores de conversión. Al igual que scanf, fscanf deja de leer una cadena cuando encuentra un espacio o un salto de línea.

El siguiente programa demuestra la lectura del archivo fputs_test.txt usando las funciones fgets(), fscanf() y fgetc() respectivamente:

#include <stdio.h>
int main() {
        FILE * file_pointer;
        char buffer[30], c;

        file_pointer = fopen("fprintf_test.txt", "r");
        printf("----read a line----\n");
        fgets(buffer, 50, file_pointer);
        printf("%s\n", buffer);

        printf("----read and parse data----\n");
        file_pointer = fopen("fprintf_test.txt", "r"); //reset the pointer
        char str1[10], str2[2], str3[20], str4[2];
        fscanf(file_pointer, "%s %s %s %s", str1, str2, str3, str4);
        printf("Read String1 |%s|\n", str1);
        printf("Read String2 |%s|\n", str2);
        printf("Read String3 |%s|\n", str3);
        printf("Read String4 |%s|\n", str4);

        printf("----read the entire file----\n");

        file_pointer = fopen("fprintf_test.txt", "r"); //reset the pointer
        while ((c = getc(file_pointer)) != EOF) printf("%c", c);

        fclose(file_pointer);
        return 0;
    }

Resultado:

----read a line----
Learning C with Guru99

----read and parse data----
Read String1 |Learning|
Read String2 |C|
Read String3 |with|
Read String4 |Guru99|
----read the entire file----
Learning C with Guru99

Lectura de datos desde un archivo en la salida de C

  1. En el programa anterior, hemos abierto el archivo llamado “fprintf_test.txt”, que fue escrito previamente usando la función fprintf(), y contiene “Learning C with GuruCadena "99". La leemos usando la función fgets() que lee línea por línea, donde el tamaño del búfer debe ser suficiente para manejar la línea completa.
  2. Reabrimos el archivo para restablecer el puntero de archivo para que apunte al principio del archivo. Creamos varias variables de cadena para manejar cada palabra por separado. Imprimimos las variables para ver su contenido. La función fscanf() se utiliza principalmente para...tracy analizar datos de un archivo.
  3. Vuelva a abrir el archivo para restablecer el archivo de puntero para que apunte al principio del archivo. Lea los datos e imprímalos desde el archivo carácter por carácter usando la función getc() hasta que encuentre la declaración EOF
  4. Luego de realizar una operación de lectura de archivo utilizando diferentes variantes, nuevamente cerramos el archivo utilizando la función fclose.

Lectura y escritura de archivos interactivos con getc y putc

Estas son las operaciones de archivo más simples. Getc significa obtener un carácter y putc significa poner un carácter. Estas dos funciones se utilizan para manejar solo un carácter a la vez.

El siguiente programa demuestra las funciones de manejo de archivos en la programación 'C':

#include <stdio.h>
int main() {
        FILE * fp;
        char c;
        printf("File Handling\n");
        //open a file
        fp = fopen("demo.txt", "w");
        //writing operation
        while ((c = getchar()) != EOF) {
            putc(c, fp);
        }
        //close file
        fclose(fp);
        printf("Data Entered:\n");
        //reading
        fp = fopen("demo.txt", "r");
        while ((c = getc(fp)) != EOF) {
            printf("%c", c);
        }
        fclose(fp);
        return 0;
    }

Salida:

Lectura y escritura interactiva de archivos en la salida de C

Salida de archivos getc y putc en C

  1. En el programa anterior hemos creado y abierto un archivo llamado demo en modo de escritura.
  2. Después de realizar una operación de escritura, el archivo se cierra mediante la función fclose.
  3. Hemos abierto nuevamente un archivo que ahora contiene datos en modo de lectura. Se ejecutará un bucle while hasta que se encuentre el fin del archivo. Una vez que se encuentre el fin del archivo, se finalizará la operación y se mostrarán los datos mediante la función printf.
  4. Después de realizar una operación de lectura, el archivo se cierra nuevamente utilizando la función fclose.

Preguntas Frecuentes

El modo texto traduce los caracteres de salto de línea para que coincidan con el sistema operativo, mientras que el modo binario, que se abre con “rb” o “wb”, escribe los bytes tal cual. Utilice el modo binario para imágenes, audio o cualquier dato en el que sea necesario conservar la disposición exacta de los bytes.

La función fopen devuelve NULL cuando no se puede abrir un archivo, por ejemplo, si el archivo no existe, si se deniegan los permisos o si el disco está lleno. Siempre compruebe si el puntero devuelto es NULL antes de leer o escribir; de lo contrario, el programa utilizará un puntero no válido y, por lo general, fallará.

El modo de escritura “w” trunca un archivo existente, borrando su contenido antes de escribir, y crea el archivo cuando no existe. El modo de adición “a” conserva los datos existentes y agrega contenido nuevo al final, por lo que no se pierde nada de lo que ya está almacenado.

fseek mueve el puntero de archivo a un desplazamiento de byte medido desde SEEK_SET, SEEK_CUR o SEEK_END. ftell devuelve la posición actual del puntero en bytes, y rewind lo envía de vuelta al inicio del archivo. Juntas, proporcionan acceso aleatorio en lugar de lectura secuencial.

fgets lee una línea completa, detenteping En un salto de línea o después de n-1 caracteres, respeta el tamaño del búfer. fscanf lee tokens formateados y separados por espacios, y puede desbordar una matriz corta. Para leer líneas completas de forma segura, fgets es la mejor opción.

EOF es una constante, generalmente -1, que marca el final de un archivo. Las funciones de lectura como getc, fgetc y fscanf devuelven EOF cuando ya no quedan datos, por lo que los bucles comparan su resultado con EOF para detener la lectura.

Sí. Un asistente de codificación con IA puede generar rutinas fopen, fprintf y fgets a partir de una instrucción en lenguaje natural, explicar cada modo de archivo e identificar errores como la falta de una comprobación de NULL o un archivo sin cerrar. Siempre compile y pruebe el código sugerido por la IA antes de confiar en él.

Copiloto de GitHub Escribe código C para el manejo de archivos, sugiriendo bloques completos de fopen, fputs y fscanf a partir de un comentario breve o el nombre de una función. A menudo añade la llamada a fclose correspondiente y una comprobación de errores, aunque conviene revisar la lógica generada.

Resumir este post con: