73 - Archivos binarios: desplazamiento del puntero de archivo (fseek)


En el concepto anterior vimos que cuando abrimos un archivo binario para su lectura el puntero de archivo se posiciona en el byte 0 y a medida que llamamos a la función fread el puntero de archivo se desplaza.

Veremos ahora una función que nos permite desplazar el puntero de archivo a cualquier posición previo a la lectura.

Con el desplazamiento del puntero de archivo no estamos obligados a leer en forma secuencial los datos.

La función que nos permite desplazar el puntero de archivo se llama fseek y tiene tres parámetros:

fseek([nombre lógico del archivo], [cantidad de bytes a desplazarse], [ubicación desde donde comenzar a desplazarse])

El tercer parámetro puede tomar alguno de estos tres valores (son tres macros definidas en el archivo stdio.h):

Problema 1:

Abrir el archivo binario que se creó en conceptos anteriores: "archivo1.dat" y leer solo los bytes donde se almacena el valor float. Recordemos que el archivo almacena un caracter, un entero y un float en ese orden.

lectura archivo binario c

Archivo: programa218.c

Ver video

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

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

Abrimos el archivo para lectura:

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

Desplazamos 5 bytes el puntero de archivo desde el comienzo (debemos saltear el char y el int)

    fseek(arch,5,SEEK_SET);
desplazar puntero de archivo lenguaje C fseek

Luego de desplazar podemos leer los siguientes cuatro bytes que contienen el valor de tipo float:

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

Problema 2:

Abrir el archivo binario : "archivo1.dat" y leer e imprimir el char y el float.

lectura archivo binario c

Archivo: programa219.c

#include<stdio.h>
#include<conio.h>
#include<stdlib.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);         //A
    fseek(arch,4,SEEK_CUR);
    float v2;
    fread(&v2, sizeof(float), 1, arch);
    printf("float: %0.2f\n",v2);        /5.25
    fclose(arch);
    getch();
    return 0;
}

Abrimos el archivo, luego de eso ya tenemos el puntero de archivo al comienzo y procedemos a leer el primer byte donde se aloja el caracter:

    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);       //A

El puntero avanza un byte luego de leer, entonces como queremos leer el float que se encuentra después del int procedemos a avanzar desde la posición actual (SEEK_CUR) cuatro bytes:

    fseek(arch,4,SEEK_CUR);
    float v2;
    fread(&v2, sizeof(float), 1, arch);
    printf("float: %0.2f\n",v2);        /5.25

Problemas propuestos

Ver video

Solución

programa220.c

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

int main()
{
    int v1,v2;
    float f1,f2;
    printf("Ingrese el primer entero:");
    scanf("%i",&v1);
    printf("Ingrese el segundo entero:");
    scanf("%i",&v2);
    printf("Ingrese el primer float:");
    scanf("%f",&f1);
    printf("Ingrese el segundo float:");
    scanf("%f",&f2);

    FILE *arch;
    arch=fopen("archivo2.dat","wb");
    if (arch==NULL)
        exit(1);
    fwrite(&v1, sizeof(int), 1, arch);
    fwrite(&v2, sizeof(int), 1, arch);
    fwrite(&f1, sizeof(float), 1, arch);
    fwrite(&f2, sizeof(float), 1, arch);
    fclose(arch);

    printf("Se creo un archivo binario y se almacenaron los cuatro datos.");

    getch();
    return 0;
}




programa221.c

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

int main()
{
    FILE *arch;
    arch=fopen("archivo2.dat","rb");
    if (arch==NULL)
        exit(1);
    int entero1,entero2;
    fread(&entero1, sizeof(int), 1, arch);
    printf("Primer entero:%i\n",entero1);
    fread(&entero2, sizeof(int), 1, arch);
    printf("Segundo entero:%i\n",entero2);
    float real1,real2;
    fread(&real1, sizeof(float), 1, arch);
    printf("Primer float:%0.2f\n",real1);
    fread(&real2, sizeof(float), 1, arch);
    printf("Segundo float:%0.2f\n",real2);
    fclose(arch);
    getch();
    return 0;
}




programa222.c

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

int main()
{
    FILE *arch;
    arch=fopen("archivo2.dat","rb");
    if (arch==NULL)
        exit(1);
    float real1,real2;
    fseek(arch, 8, SEEK_SET);
    fread(&real1, sizeof(float), 1, arch);
    printf("Primer float:%0.2f\n",real1);
    fread(&real2, sizeof(float), 1, arch);
    printf("Segundo float:%0.2f\n",real2);
    fclose(arch);
    getch();
    return 0;
}

Retornar