GNU/Linux >> Tutoriales Linux >  >> Linux

Manejo de archivos en C con ejemplos (fopen, fread, fwrite, fseek)

Al igual que con cualquier sistema operativo, el manejo de archivos es un concepto central en Linux. Cualquier programador de sistemas lo aprendería como una de sus asignaciones iniciales de programación. Este aspecto de la programación involucra archivos de sistema.

A través del manejo de archivos, uno puede realizar operaciones como crear, modificar, eliminar, etc. en los archivos del sistema. Aquí, en este artículo, trato de traer lo básico del manejo de archivos. Espero que este artículo elimine la capa superior de este aspecto multicapa.

Funciones de manejo de archivos

En este artículo, cubriremos las siguientes funciones que se usan popularmente en el manejo de archivos:

fopen()

FILE *fopen(const char *path, const char *mode);

La función fopen() se utiliza para abrir un archivo y asociarle un flujo de E/S. Esta función toma dos argumentos. El primer argumento es un puntero a una cadena que contiene el nombre del archivo que se abrirá, mientras que el segundo argumento es el modo en que se abrirá el archivo. El modo puede ser:

  • 'r'    :  Abrir archivo de texto para leer. La secuencia se coloca al principio del archivo.
  • 'r+':abierto para lectura y escritura. La secuencia se coloca al principio del archivo.
  • 'w'   :  Trunca el archivo a cero o crea un archivo de texto para escribir. La secuencia se coloca al principio del archivo.
  • 'w+' :Abierto para lectura y escritura. El archivo se crea si no existe, de lo contrario se trunca. La secuencia se coloca al principio del archivo.
  • 'a'    :Abrir para agregar (escribir al final del archivo). El archivo se crea si no existe. La secuencia se coloca al final del archivo.
  • ‘a+’ :Abierto para lectura y anexión (escribir al final del archivo). El archivo se crea si no existe. La posición inicial del archivo para lectura es al principio del archivo, pero la salida siempre se agrega al final del archivo.

La función fopen() devuelve un puntero de flujo de ARCHIVO en caso de éxito, mientras que devuelve NULL en caso de falla.

fread() y fwrite()

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);

Las funciones fread/fwrite se utilizan para leer/escribir datos desde/hacia el archivo abierto por la función fopen. Estas funciones aceptan tres argumentos. El primer argumento es un puntero al búfer utilizado para leer/escribir los datos. Los datos leídos/escritos están en forma de elementos 'nmemb', cada byte de 'tamaño' de largo.

En caso de éxito, fread/fwrite devuelve el número de bytes realmente leídos/escritos desde/hacia el flujo abierto por la función fopen. En caso de falla, se devuelve un número menor de byes (luego se solicita lectura/escritura).

fbuscar()

int fseek(FILE *stream, long offset, int whence);

La función fseek() se usa para establecer el indicador de posición del archivo para la transmisión en una nueva posición. Esta función acepta tres argumentos. El primer argumento es el puntero de flujo de ARCHIVO devuelto por la función fopen(). El segundo argumento 'offset' indica la cantidad de bytes a buscar. El tercer argumento 'de dónde' indica desde dónde se debe realizar la búsqueda del número de bytes 'compensados'. Los valores disponibles para el origen son SEEK_SET, SEEK_CUR o SEEK_END. Estos tres valores (en orden) representan el inicio del archivo, la posición actual y el final del archivo.

Si tiene éxito, esta función devuelve 0, de lo contrario, devuelve -1.

fcerrar()

int fclose(FILE *fp);

La función fclose() primero vacía el flujo abierto por fopen() y luego cierra el descriptor subyacente. Una vez completada con éxito, esta función devuelve 0; de lo contrario, se devuelve el final del archivo (eof). En caso de falla, si se accede más a la transmisión, el comportamiento permanece indefinido.

El código

#include<stdio.h>
#include<string.h>

#define SIZE 1
#define NUMELEM 5

int main(void)
{
    FILE* fd = NULL;
    char buff[100];
    memset(buff,0,sizeof(buff));

    fd = fopen("test.txt","rw+");

    if(NULL == fd)
    {
        printf("\n fopen() Error!!!\n");
        return 1;
    }

    printf("\n File opened successfully through fopen()\n");

    if(SIZE*NUMELEM != fread(buff,SIZE,NUMELEM,fd))
    {
        printf("\n fread() failed\n");
        return 1;
    }

    printf("\n Some bytes successfully read through fread()\n");

    printf("\n The bytes read are [%s]\n",buff);

    if(0 != fseek(fd,11,SEEK_CUR))
    {
        printf("\n fseek() failed\n");
        return 1;
    }

    printf("\n fseek() successful\n");

    if(SIZE*NUMELEM != fwrite(buff,SIZE,strlen(buff),fd))
    {
        printf("\n fwrite() failed\n");
        return 1;
    }

    printf("\n fwrite() successful, data written to text file\n");

    fclose(fd);

    printf("\n File stream closed through fclose()\n");

    return 0;
}

El código anterior asume que tiene un archivo de prueba "test.txt" ubicado en la misma ubicación desde donde se ejecutará este ejecutable.

Inicialmente, el contenido del archivo es:

$ cat test.txt
hello everybody

Ahora, ejecuta el código:

$ ./fileHandling 

 File opened successfully through fopen()

 Some bytes successfully read through fread()

 The bytes read are [hello]

 fseek() successful

 fwrite() successful, data written to text file

 File stream closed through fclose()

Vuelva a comprobar el contenido del archivo test.txt. Como puede ver a continuación, se modificó el contenido del archivo.

$ cat test.txt
hello everybody
hello

Linux
  1. Ordenar comando en Linux con ejemplos

  2. Más de 10 comandos de Linux VI con ejemplos

  3. Comando chattr en Linux con ejemplos

  4. Uso de Logrotate en Linux para administrar archivos de registro (con ejemplos)

  5. 10 Ejemplos de comandos Sed (Editor de flujo)

Marcas de tiempo de archivos de Linux explicadas con ejemplos

Redirección de Bash explicada con ejemplos

Uso del comando Linux mv con ejemplos

Comando de montaje de Linux con ejemplos

Comando gawk de Linux con ejemplos

Comando make de Linux con ejemplos