Proponiamo ancora degli esercizi sui file in C ed in particolare sulle funzioni fopen, fwrite, fread e fclose.
Propongo questo esempio a scopo di introdurre, prossimamente, altre funzioni che ci permetteranno di posizionarci in una posizione qualunque del file e che quindi garantiscono un accesso diretto e non più sequenziale.
Esercizi sui file in C – problema
In un file binario sono memorizzati i dati di un vettore che contiene al massimo 50 elementi. Stampare i dati di questo file, se presenti, altrimenti dare come messaggio: “Nessun dato presente!”. Dopo chiedere quanti dati si vogliono aggiungere al vettore e creare una funzione che consenta di farlo. Creare un’altra funzione per il salvataggio di questi dati nel vettore. Infine ristampare nuovamente i dati del file aggiornati con il nuovo inserimento.
Le funzioni/procedure utilizzate sono dunque 4. Notate come la funzione init deve restituire un intero che corrisponde al numero di elementi che vengono inseriti nel vettore. Mentre le altre procedure non ritornano alcun valore.
Quindi la funzione init ha il compito di aprire in lettura il file binario, utilizzando fopen, e se l’operazione ha successo legge gli elementi in esso presenti utilizzando la funzione fread. Se non ci sono dati verrà stampato un messaggio: Nessun dato presente! Dopo chiudiamo il file binario con la funzione fclose.
La procedura print stampa semplicemente i dati presenti senza restituire alcun valore. Prende come parametri il vettore e il numero degli elementi.
La procedura add ha il compito di aggiungere gli elementi e quindi ha la necessità di prendere come parametri non solo il vettore ma anche il puntatore all’ultimo elemento inserito. Quindi chiediamo quanti elementi inserire e li aggiungiamo a quelli precedenti. Potremmo fare anche un controllo per far in modo che non si inseriscano più elementi rispetto alla dimensione massima dichiarata, che in questo caso è 50.
Infine la procedura save si occupa di salvare i dati inseriti nel file.
Ecco dunque il listato completo:
#include <stdio.h>
#define N 50
int init(int*V);
void print(int *V,int n);
void add(int *V,int *pn);
void save(int *V,int n);
void main(){
int a[N],i,n;
n=init(a);
print(a,n);
add(a,&n);
save(a,n);
printf("Ristampo i dati contenuti nel file con l'aggiunta");
print(a,n);
}
int init(int *V){
FILE *pf;
int i=0;
pf=fopen("vettori.dat","rb");
if(pf)
while(fread(&V[i],sizeof(int),1,pf)>0 && i<N)
i++;
else
printf("Nessun dato presente!");
fclose(pf);
return i;
}
void print(int *V, int n){
int i;
printf("\nElementi totali presenti: %d\n", n);
for(i=0;i<n;i++)
printf("%d\n", V[i]);
}
void add(int *V,int *pos){
int x,i;
printf("Elementi da aggiungere (max %d): ", N-*pos);
scanf("%d",&x);
for(i=*pos;i<*pos+x;i++){
printf("Numero %d: ", i+1);
scanf("%d",&V[i]);
};
*pos+=x;
}
void save(int *V,int n){
FILE *pf;
pf=fopen("vettori.dat","wb");
if(pf)
fwrite(V,sizeof(int),n,pf);
else
printf("Errore in scrittura\n");
}
Questi sono solo alcuni degli esercizi sui file in C che vi propongo in questo semplice tutorial.
Alcuni link utili
Allocazione dinamica della memoria con malloc
Realizzare un menù di scelta in C
Come sommare gli elementi della cornice esterna