Dimensione di un file

Un modo possibile per determinare la dimensione di un file è quello di aprire il file, posizionarsi alla fine del file, e usare ftell per vedere in che posizione ci troviamo.

Per posizionarsi alla fine del file usiamo l'istruzione fseek(fd, 0, SEEK_END). Il terzo valore passato, ossia SEEK_END, dice che occorre fare un posizionamento non rispetto alla posizione corrente oppure all'inizio del file, ma rispetto alla fine del file. I tre valori che è possibile dare come terzo argomento alla funzione fseek hanno quindi il seguente significato:

feeks(fd, n, SEEK_CUR)
sposta la posizione nel file di n posizioni rispetto alla posizione corrente;
feeks(fd, n, SEEK_SET)
sposta la posizione nel file di n posizioni rispetto alla posizione iniziale, ossia la nuova posizione è esattamente n;
feeks(fd, n, SEEK_END)
sposta la posizione nel file di n posizioni rispetto alla posizione finale del file.

Si ricordi che n può essere positivo oppure negativo. Un valore positivo indica uno spostamento in avanti, un valore negativo indica uno spostamento all'indietro, sempre rispetto alla posizione specificata come terzo argomento. Per esempio, per posizionarsi sul terz'ultimo byte di un file, occorre tenere presente che questo è uno spostamento alla fine del file meno tre posizioni, per cui occorre fare fseek(fd, -3, SEEK_END).

Per posizionarsi alla fine del file, occorre quindi eseguire fseek(fd, 0, SEEK_END);. Si tenga presente che questa istruzione mette la posizione corrente al primo byte dopo l'ultimo byte del file. In altre parole, se dopo questa istruzione si scrive, il dato non va a sovrapporsi all'ultimo byte del file, ma viene scritto immediatamente dopo.

Dopo aver fatto il posizionamento alla fine del file, la funzione ftell dice qual'è la posizione nel file, e quindi determina il numero di byte del file (si consideri che la posizione parte da 0). Nel caso in cui il file contenga degli interi, si piò determinare quanti interi ci sono sul file dividendo il numero di byte per sizeof(int).

dimensione.c

/*
  Determina il numero di byte di un file binario
(e il numero di interi che contiene).
*/

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

int main(int argn, char *argv[]) {
  FILE *fd;
  int size, dim;


		/* controllo argomenti */
  if(argn-1!=1) {
    printf("Errato numero di argomenti\n");
    exit(1);
  }

		/* apre il file */
  fd=fopen(argv[1], "r+");
  if(fd==NULL) {
    perror("Errore in apertura del file");
    exit(1);
  }

		/* determina la dimensione del file */
  fseek(fd, 0, SEEK_END);
  size=ftell(fd);
  printf("Numero di byte su file: %d\n", size);


		/* se il file contiene interi, dice quanti sono */
  dim=size/sizeof(int);
  printf("Numero di interi su file: %u/%d = %u\n", size, sizeof(int), dim);


		/* chiude il file */
  fclose(fd);

  return 0;
}


Un secondo metodo per determinare la dimensione di un file consiste nell'uso della funzione stat. Questa funzione ha due parametri: il primo è il nome di un file (che non deve necessariamente essere stato aperto), e l'indirizzo di una variabile di tipo struct stat. Questa funzione modifica la struttura mettendoci i valori di alcune caratteristiche del file. In particolare, il campo st_size della struttura contiene la dimensione del file, ossia il numero di byte che contiene.

Per usare la funzione stat è necessaria la definizione della struttura struct stat, che si trova nel file header sys/stat.h. Il programma completo è dimstat.c che è riportato qui sotto.

/*
  Determina il numero di byte di un file binario
(e il numero di interi che contiene). Usa la
funzione stat
*/

#include<stdlib.h>
#include<stdio.h>
#include <sys/stat.h>

int main(int argn, char *argv[]) {
  int res;
  struct stat sstr;
  int size, dim;


		/* controllo argomenti */
  if(argn-1!=1) {
    printf("Errato numero di argomenti\n");
    exit(1);
  }

		/* apre il file */
  res=stat(argv[1], &sstr);
  if(res==-1) {
    perror("Errore in lettura del file");
    exit(1);
  }

		/* determina la dimensione del file */
  size=sstr.st_size;
  printf("Numero di byte su file: %d\n", size);


		/* se il file contiene interi, dice quanti sono */
  dim=size/sizeof(int);
  printf("Numero di interi su file: %u/%d = %u\n", size, sizeof(int), dim);


  return 0;
}