Proponiamo oggi alcuni esercizi su file e strutture in C. Utilizzeremo i file binari e le funzioni fclose, fopen, fread e fwrite.
Esercizi su file e strutture in C
Il primo esercizio che svolgeremo è una variazione dell’esercizio precedente, proponiamo in aggiunta l’uso delle funzioni, così da approfondirne l’uso.
Creare una struct studente che contiene la matricola, il nome, il cognome e il voto. Creare una funzione/procedura per l’inserimento dei dati e un’altra per la stampa degli studenti inseriti. I dati saranno inseriti e letti in un file binario di nome student.dat.
Innanzitutto creiamo la struct come richiesta nel problema sopra. Dopo creiamo i prototipi delle funzioni che utilizzeremo per inserire e stampare i dati. Entrambe le funzioni prendono come parametro il file pointer, cioè il puntatore al file restituito dalla funzione fopen.
Apriamo il file binariostudent.dat in scrittura e se non ci sono problemi nell’apertura richiamiamo la procedura insert che si occupa di richiedere e registrare i dati in input.
Dopo occorre riaprire il file binario in lettura e verificare che l’apertura non abbia prodotto problemi. Quindi si invoca la procedura print che provvederà a stampare i campi inseriti precedentemente in input.
Notate che la chiusura del file, con fclose, avviene ovviamente sia dopo aver inserito i dati, sia dopo la stampa dei dati. Infatti il file viene aperto due volte, prima in scrittura e poi in lettura.
Ecco dunque il listato completo:
#include <stdio.h>
#include <stdlib.h>
typedef struct {
char nome[20];
char cognome[20];
int voto;
int id;
} studente;
void insert(FILE *pf); //prototipo funzione
void print(FILE *pf); //prototipo funzione
void main(void){
FILE *pf;
pf=fopen("student.dat","wb");
if(pf){
insert(pf);
fclose(pf);
}
else
printf("Errore in scrittura\n");
pf=fopen("student.dat","rb");
if(pf) {
print(pf);
fclose(pf);
}
else
printf("Errore in lettura");
}
void insert(FILE *pfile){
studente s;
printf("\nInserisci Matricola:");
scanf("%d",&s.id);
printf("Inserisci il cognome:");
scanf("%s",s.cognome);
printf("Inserisci il nome:");
scanf("%s",s.nome);
printf("Inserisci il voto:");
scanf("%d",&s.voto);
fwrite(&s,sizeof(s),1,pfile);
}
void print(FILE *pfile){
studente st;
fread(&st,sizeof(studente),1,pfile);
printf("\nMatricola: %d\n",st.id);
printf("Cognome: %s\n",st.cognome);
printf("Nome: %s\n",st.nome);
printf("Voto: %d\n",st.voto);
}
Questo era uno degli esercizi su file e strutture in C, nella prossima lezione ne proporrò degli altri.
Alcuni link utili
Allocazione dinamica della memoria con malloc
Realizzare un menù di scelta in C
Come sommare gli elementi della cornice esterna