72 - Archivos binarios: lectura de datos primitivos (fread)


Vimos en el concepto anterior como crear archivos binarios y grabar tipos de datos primitivos empleando las funciones que provee el lenguaje C.

Ahora veremos como leer los datos contenidos en un archivo binario.

Para trabajar con los datos almacenados en un archivo debemos hacer una copia de los mismos en la memoria ram.

Debemos conocer los tipos de datos almacenados en el archivo binario y el orden exacto como están guardados.

Problema 1:

Abrir el archivo binario que se creó en el concepto anterior: "archivo1.dat" y leer sus datos. Recordemos que el archivo almacena un caracter, un entero y un float en ese orden.

lectura archivo binario c

Archivo: programa217.c

#include<stdio.h>

int main()
{
    FILE *arch;
    arch=fopen("archivo1.dat","rb");
    if (arch==NULL)
        exit(1);
    char c;
    fread(&c, sizeof(char), 1, arch);
    printf("caracter: %c\n",c);
    int v1;
    fread(&v1, sizeof(int), 1, arch);
    printf("entero: %i\n",v1);
    float v2;
    fread(&v2, sizeof(float), 1, arch);
    printf("float: %0.2f\n",v2);
    fclose(arch);
    getch();
    return 0;
}

Cuando ejecutamos el programa podemos ver que se recuperan los datos almacenados en la ejecución del programa del concepto anterior:

lectura archivo binario c

Veamos cuales son los pasos para la lectura de datos almacenados en "archivo1.dat". Lo primero que hacemos es abrir el archivo y pasar en el segundo parámetro que queremos abrir el archivo para lectura: "rb" (read binary):

    FILE *arch;
    arch=fopen("archivo1.dat","rb");

Controlamos seguidamente si el archivo no se pudo abrir para finalizar el programa:

    if (arch==NULL)
        exit(1);

Cuando procesamos un archivo aparece el concepto de un puntero que indica cual es el próximo byte a leer. Inmediatamente que se abre un archivo para leer "rb" este puntero se posiciona en el byte 0 y a medida que leemos este puntero avanza.

Para leer datos de un archivo se emplea la función fread que tiene cuatro parámetros:

La lectura del primer byte sucede:

    char c;
    fread(&c, sizeof(char), 1, arch);
    printf("caracter: %c\n",c);

Luego de la ejecución de primer fread tenemos que el puntero avanza un byte y queda posicionado para leer el próximo dato:

    int v1;
    fread(&v1, sizeof(int), 1, arch);
    printf("entero: %i\n",v1);

El segundo fread lee cuatro bytes y los almacena en la variable v1, además avanza el puntero de archivo para próxima lectura.

La última lectura lee el espacio donde se almacena el float:

    float v2;
    fread(&v2, sizeof(float), 1, arch);
    printf("float: %0.2f\n",v2);

No olvidar cerrar el archivo para su liberación y permitir que otros programas lo accedan:

    fclose(arch);

La lectura secuencial del char, int y float se puede efectuar fácilmente ya que la función fread luego de leer avanza el puntero de archivo y lo deja posicionado para la lectura del siguiente dato.

Si no conocemos la estructura interna del archivo binario (en nuestro ejemplo un char, un int y finalmente un float) será imposible recuperar correctamente la información almacenada.

Retornar