Está en la página 1de 4

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

 SEEK_SET Reposicionar comenzando desde el principio del archivo (es lo mismo poner un 0)
 SEEK_CUR Reposicionar comenzando desde la posición actual del puntero de archivo (es lo mismo poner
un 1)
 SEEK_END Reposicionar comenzando desde el final del archivo (es lo mismo poner un 2)

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.

ArchivosBinarios3fseek.c
#include<stdio.h> //aqui estan las funciones fseek
#include<conio.h>
#include<stdlib.h>

int main()
{
FILE *arch; //definimos puntero de tipo file

arch=fopen("archivo1.dat","rb"); //inicializamos y abrimos archivo con fopen con rb

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

float v2; //SEEk_SET comenzaremos contando desde el principio


fseek(arch,5,SEEK_SET); //desplazamos el puntero al arch 5 bytes que es v2 float
fread(&v2, sizeof(float), 1, arch); //para leer datos fread
printf("float: %0.2f\n",v2); //para imprimir los datos
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);

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.

ArchivosBinarios4fseek.c
#include<stdio.h> //aqui estan las funciones fseek
#include<conio.h>
#include<stdlib.h>

int main()
{
FILE *arch; //definimos puntero de tipo file

arch=fopen("archivo1.dat","rb"); //creamos y abrimos archivo con fopen con rb

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

char c; //SEEK_CUR comenzaremos contando desde la posicion actual


fread(&c, sizeof(char), 1, arch); //leemos sin desplazar el archivo xque el char esta al princ
printf("caracter: %c\n",c); //imprimimos y nos sale el caracter char A

fseek(arch,4,SEEK_CUR); //desplazamos el puntero al arch 4 bytes que sera v1 int

float v2;
fread(&v2, sizeof(float), 1, arch); //para leer datos fread
printf("float: %0.2f\n",v2); ////para imprimir los datos 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

Crear un archivo llamado "archivo2.dat". Solicitar la carga de dos enteros y dos float
por teclado. Almacenar en el archivo primero los dos enteros y seguidamente los dos
float. .
Abrir el archivo "arhivo2.dat" creado en el programa anterior y proceder a su lectura e
impresión.
Abrir el archivo "arhivo2.dat" e imprimir solo los dos valores de tipo float
almacenados.

ArchivosBinarios5fseek.c
#include<stdio.h> //aqui estan las funciones open, write y close
#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; //definimos puntero de tipo file

arch=fopen("archivo2.dat","wb"); //abrimos archivo con fopen con wb

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

fwrite(&v1, sizeof(int), 1, arch); //para grabar datos fwrite


fwrite(&v2, sizeof(int), 1, arch);
fwrite(&f1, sizeof(float), 1, arch);
fwrite(&f2, sizeof(float), 1, arch);

fclose(arch); //liberamos el archivo con fclose

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

getch();
return 0;
}

ArchivosBinarios6fseek.c
#include<stdio.h> //aqui estan las funciones fread
#include<conio.h>
#include<stdlib.h>
int main()
{
FILE *arch; //definimos puntero de tipo file

arch=fopen("archivo2.dat","rb"); //abrimos archivo con fopen con rb

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

int entero1,entero2;

fread(&entero1, sizeof(int), 1, arch); //para leer datos fread


printf("Primer entero:%i\n",entero1);

fread(&entero2, sizeof(int), 1, arch); //para leer datos fread


printf("Segundo entero:%i\n",entero2);

float real1,real2;

fread(&real1, sizeof(float), 1, arch); //para leer datos fread


printf("Primer float:%0.2f\n",real1);

fread(&real2, sizeof(float), 1, arch); //para leer datos fread


printf("Segundo float:%0.2f\n",real2);

fclose(arch); //liberamos el archivo con fclose

getch();
return 0;
}

ArchivosBinarios7fseek.c
#include<stdio.h> //aqui estan las funciones fseek
#include<conio.h>
#include<stdlib.h>

int main()
{
FILE *arch; //definimos puntero de tipo file

arch=fopen("archivo2.dat","rb"); //creamos y abrimos archivo con fopen con rb

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

float real1,real2; //SEEk_SET comenzaremos contando desde el principio


//saltamos los 2 enteros que van primero 4+4=8bytes
fseek(arch, 8, SEEK_SET); //desplazamos el puntero al arch 8 bytes es v2 float real1

fread(&real1, sizeof(float), 1, arch); //para leer datos fread


printf("Primer float:%0.2f\n",real1); //para imprimir los datos

fread(&real2, sizeof(float), 1, arch); //para leer datos fread


printf("Segundo float:%0.2f\n",real2); //para imprimir los datos

fclose(arch); //liberamos el archivo con fclose

getch();
return 0;
}

También podría gustarte