77 - Archivos binarios: posición actual del puntero de archivo (ftell)


Hemos dicho en conceptos anteriores que cuando trabajamos con archivos aparece el puntero de archivo que nos indica donde estamos posicionados para proceder a la lectura de un dato o grabación.

Mediante la función fseek podemos desplazar el puntero de archivo a cualquier byte del mismo, como vimos si queremos grabar datos al final lo desplazamos con el fseek fácilmente al final.

Ahora veremos que hay una función que nos informa en que byte del archivo está el puntero:

int ftell([nombre lógico del archivo])

Problema 1:

Confeccionar un programa con dos funciones:
1 - Creación de un archivo binario llamado "archivo6.dat" y grabar 3 enteros, después de grabar cada dato imprimir la posición del puntero de archivo.
2 - Imprimir el archivo en forma completa, mostrar además la posición del puntero de archivo después de leer.

Archivo: programa227.c

Ver video

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

void crear()
{
    FILE *arch;
    arch=fopen("archivo6.dat","wb");
    if (arch==NULL)
        exit(1);
    int valor1=10;
    fwrite(&valor1, sizeof(int), 1, arch);
    int pos=ftell(arch);
    printf("Posicion del puntero de archivo luego grabar un entero:%i\n", pos);
    int valor2=20;
    fwrite(&valor2, sizeof(int), 1, arch);
    pos=ftell(arch);
    printf("Posicion del puntero de archivo luego grabar un entero:%i\n", pos);
    int valor3=30;
    fwrite(&valor3, sizeof(int), 1, arch);
    pos=ftell(arch);
    printf("Posicion del puntero de archivo luego grabar un entero:%i\n", pos);
    fclose(arch);
}

void imprimir()
{
    FILE *arch;
    arch=fopen("archivo6.dat","rb");
    if (arch==NULL)
        exit(1);
    printf("Todos los datos almacenados en el archivo.\n");
    int x;
    int pos;
    fread(&x, sizeof(int), 1, arch);
    while(!feof(arch))
    {
        pos=ftell(arch);
        printf("dato leido %i y posicion del puntero de archivo %i\n",x,pos);
        fread(&x, sizeof(int), 1, arch);
    }
    fclose(arch);
}

int main()
{
    crear();
    imprimir();
    getch();
    return 0;
}

Con la ejecución de este programa podemos comprobar que cada vez que grabamos un dato en el archivo mediante la función fwrte el puntero de archivo avanza tantos bytes como el tamaño del tipo de dato que pasamos. De forma similar cuando leemos con la función fread el puntero de archivo también avanza:

funcion ftell lenguaje C

Podemos llamar la función ftell en cualquier momento que se encuentre el archivo abierto tanto para lectura o escritura:

    fwrite(&valor1, sizeof(int), 1, arch);
    int pos=ftell(arch);
    printf("Posicion del puntero de archivo luego grabar un entero:%i\n", pos);

Problema 2:

Confeccionar un programa que imprima el tamaño en bytes del archivo "archivo6.dat" creado en el programa anterior.

Archivo: programa228.c

Ver video

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

int main()
{
    FILE *arch;
    arch=fopen("archivo6.dat","rb");
    if (arch==NULL)
        exit(1);
    fseek(arch,0,SEEK_END);
    int pos=ftell(arch);
    printf("El tamaño del archivo \"archivo6.dat\" es de %i bytes",pos);
    fclose(arch);
    getch();
    return 0;
}

Para conocer el tamaño en bytes de un archivo podemos efectuar la apertura para lectura:

    arch=fopen("archivo6.dat","rb");
    if (arch==NULL)
        exit(1);

Desplazar el puntero de archivo al final:

    fseek(arch,0,SEEK_END);

Y finalmente llamar a la función ftell:

    int pos=ftell(arch);
    printf("El tamaño del archivo \"archivo6.dat\" es de %i bytes",pos);

Retornar