libri-javascript-python

La funzione fread in C permette di leggere su un file un blocco di dati di qualsiasi tipo, precedentemente aperto con la funzione fopen. La funzione fread consente quindi di leggere i dati di un file binario. Ricordiamo che un file binario memorizza dati di qualunque tipo, quindi anche dati che non sono caratteri (tipo vettori o strutture). Inoltre, per la lettura a blocchi è necessario che il file sia stato aperto in modalità binaria (b).

La sintassi della funzione fread è la seguente:

size_t fread(void *punt, size_t dim, size_t num, FILE *fp)

Dove punt rappresenta l’indirizzo della locazione di partenza da cui leggere i dati, dim rappresenta la dimensione in byte del singolo dato e num rappresenta il numero degli elementi da leggere nello stream.FILE *fp è il puntatore al file restituito dalla funzione fopen, così come nelle altre funzioni che abbiamo studiato finora.

Il valore di ritorno di fread indica il numero di elementi effettivamente letti dal file. In caso di successo il valore di ritorno deve coincidere con quello del parametro num passato alla funzione.

Se punt rappresenta un vettore, allora in esso verrano trasferite le informazioni lette dal file.

Un file può avere dimensioni elevate, quindi occorrono più chiamate ad fread. Pertanto la funzione ad ogni chiamata legge una limitata porzione di file.

Dopo l’apertura del file con fopen, il puntatore si trova all’inizio del file, ogni volta che viene chiamata fread il puntatore si sposta in avanti del numero di byte letti. Quando la funzione termina di leggere tutto il contenuto del file ritorna il valore 0 (indica quindi che il puntatore è posizionato alla fine).

Se si tenta nuovamente di leggere la funzione restituirà il valore 0 per indicare che il puntatore è a fine file.


Esempio di utilizzo di fread in C

Realizziamo un programma in linguaggio C che determini e visualizzi il numero delle occorrenze di uno specifico carattere fornito come argomento in un file di testo.

Apriamo il file con la funzione fopen e controlliamo se il puntatore restituisce il valore NULL. In caso positivo restituiamo un messaggio di errore e usciamo dal programma, altrimenti continuiamo nel nostro programma.

Quindi utilizziamo fread(buffer, sizeof(char), sizeof(buffer), fp);

Buffer dove sono trasferite le informazioni lette dal file, sizeof(buffer) indica il numero di elementi del vettore, sizeof(char) rappresenta la dimensione in byte di un elemento del vettore, fp è il file da leggere.

Inizializziamo a zero il contatore del carattere ricercato e lo incrementeremo ogni volta che verrà trovata l’occorrenza di quel carattere nel file.

Infine chiudiamo il file usando la funzione fclose e stampiamo il risultato ottenuto.

Ecco dunque il listato completo:

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

int main(int argc, char* argv[]) {
 	FILE* fp;
 	char c='d';
 	char buffer[64];
 	int i, n, count = 0;
 	
	if((fp=fopen("alunni.dat", "rb"))==NULL) {
		printf("Errore nell'apertura del file");
		exit(1);
	}

 	while(!feof(fp)){
	   	n = fread(buffer, sizeof(char), sizeof(buffer), fp);
	   	for (i=0; i<n; i++)
	      	         if (buffer[i] == c)
		   		count++;
      }
	fclose(fp);
 	printf("Il carattere \"%c\" e' presente nel file %d volte\n", c, count);
 	return 1;
}

Potevamo anche chiedere all’utente quale carattere ricercare nel file facendo una semplice modifica nell’algoritmo.

Questo è un semplice esempio d’uso della funzione fread in C, più avanti ci eserciteremo ancora.

Alcuni link utili

Indice argomenti linguaggio C

La funzione fopen

La funzione fclose

Funzione fprintf

Funzione fscanf

Allocazione dinamica della memoria con malloc

Strutture in C

Typedef struct in C

Esercitazione sulle struct in C

Matrice trasposta

Array multidimensionali

Quick sort in C