Enrere Mòdul 8
Fonaments de Programació. Llenguatge C/C++---
Pràctica    Resum teòric Exercicis
Pràctica d'ampliació

 
Trobar la mida i la data d'un arxiu

En aquesta pràctica aprendrem un ús interessant de les funcions fseek() i ftell() a més de com es pot obtenir de forma ràpida dades de l'arxiu: data, mida...

 

Desenvolupament de la pràctica

En primer lloc implementarem una funció mida() que ens donarà la mida en octets d'un arxiu de disc. Això es farà amb ajuda de les funcions fseek() i ftell().

Definiu un projecte nou anomenat m8p051 i afegiu-li un arxiu de font C/C++ anomenat m8p051.cpp. Escriviu el següent codi:

//m8p051.cpp:  Trobar la mida d'un arxiu
#include <stdio.h>

int mida(char *);

void main(int na, char*a[]){
    printf("mida de %s:%d\n",a[1],mida(a[1]));
}



int mida(char *arxiu){
    FILE *f;


    if ((f=fopen(arxiu,"rb"))==NULL){
         printf("error, no s'ha pogut obrir l'arxiu\n");
         return 0;
    }
    fseek(f, 0,SEEK_END);
    return ftell(f);

}

Explicació del programa

La funció main() d'aquest programa rep un argument a través de la línia de comandament. No es fa cap comprovació del nombre d'arguments per tal de facilitar la lectura del codi, no obstant, seria interessant fer-la. Aquest argument serà el nom de l'arxiu, la mida del qual volem saber. La mida es troba a partir de la funció mida(). Aquesta funció té com únic argument el nom de l'arxiu. Aquesta funció s'encarrega d'obrir-lo. A continuació, amb:

fseek(f, 0,SEEK_END);

fa que el punter de posició de lectura de l'arxiu apunti a la darrera posició (0 posicions començant per l'última). Aleshores, la funció ftell() torna la posició d'aquest punter començant pel principi, és a dir, torna la mida de l'arxiu.

Això ha estat un exemple d'ús de les funcions fseek() i ftell(), no obstant, no és l'única forma de trobar la mida d'un arxiu. Visual C++ incorpora una estructura i una funció que ens permet trobar propietats d'un arxiu:

Definiu un projecte nou anomenat m8p052 i afegiu-li un arxiu de font C/C++ anomenat m8p052.cpp. Escriviu el següent codi:

//m8p052:  Trobar altres dades d'un fitxer


#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>


void main(int na, char*a[]){
    struct _stat buf;
    int result;

    result = _stat( a[1], &buf ); 

    if( result != 0 ) 
        perror( "Error de la funció _stat" ); 
    else {

    printf( "Mida : %ld\n", buf.st_size );
    printf( "Drive : %c:\n", buf.st_dev + 'A' );
    printf( "Creat : %s", ctime(&buf.st_ctime ) );  

    }

}

 

Explicació del programa

Per tal d'obtenir informació d'un arxiu s'ha de fer servir l'estructura _stat i la funció del mateix nom. Les declaracions d'aquesta estructura i funció es troben als arxius capçaleres: sys/types.h i sys/stat.h. Les barres s'han de posar i signifiquen que aquests arxius es troben a la subcarpeta sys de la carpeta on es troben la majoria dels arxius de capçalera.

La funció _stat() té dos arguments. El primer és el nom de l'arxiu i el segon, un punter a una estructura de tipus _stat(). En aquest cas, la variable buf s'ha declarat com una variable d'aquesta estructura. Una vegada executada aquesta funció es pot obtenir informació de l'arxiu consultant els diferents camps de l'estructura.

El camp size ens dóna la mida de l'arxiu. El camp dev ens dóna el nom del disc on es troba l'arxiu i el camp ctime ens dóna la data i l'hora de creació. Aquest últim camp, és de fet, un punter a una altra estructura. Es pot convertir a una cadena de caràcters amb la funció ctime(), el protocol de la qual es troba a time.h.