Svilupperemo oggi degli esercizi su file e strutture in C, al fine di consolidare l’apprendimento delle funzioni sui file studiate finora.
In questi esercizi proporremo in particolar modo l’uso delle funzioni fopen, fwrite e fclose e tratteremo anche i file binari.
Esercizi su file e strutture in C
Il primo esercizio che vi voglio proporre è molto semplice.
Creare una struct alunno che contiene il nome, il cognome e il voto. Dopo inserire 5 studenti e memorizzarli in un file binario di nome archivio.txt.
Quindi apriamo in lettura il nostro file binario e diamo un messaggio di avviso qualora si dovessero presentare degli errori.
Dopo con un ciclo for inseriamo tutti i dati e con la funzione fwrite copiamo i dati nel nostro file binario.
#include<stdio.h>
#include <stdlib.h>
#define N 5
typedef struct{
char nome[20];
char cognome[20];
int voto;
}studente;
int main(){
FILE *fp;
studente s;
int i;
if((fp=fopen("archivio.txt", "wb"))==NULL) {
printf("Errore nell'apertura del file");
exit(1);
}
for(i=0;i<N;i++){
printf("Dati studente %d:\n", i+1);
scanf("%s%s%d",&s.nome,&s.cognome,&s.voto);
fwrite(&s,sizeof(studente),1,fp);
}
fclose(fp);
return 0;
}
Potremmo variare l’esercizio permettendo che sia l’utente a decidere quando terminare l’inserimento, ad esempio facendo comparire un messaggio.
Quindi ogni volta che terminiamo l’inserimento di uno studente, chiediamo all’utente se vuole proseguire oppure no.
Ecco dunque il listato completo:
#include<stdio.h>
#include <stdlib.h>
#define N 5
typedef struct{
char nome[20];
char cognome[20];
int voto;
}studente;
int main(){
FILE *fp;
studente s;
int fine=0;
if((fp=fopen("archivio2.txt", "wb"))==NULL) {
printf("Errore nell'apertura del file");
exit(1);
}
while(!fine) {
printf("Dati studente:\n");
scanf("%s%s%d",&s.nome,&s.cognome,&s.voto);
fwrite(&s,sizeof(studente),1,fp);
printf("\nVuoi terminare? (Si=1, No=0)");
scanf("%d", &fine);
}
fclose(fp);
return 0;
}
Ma questa procedura è fastidiosa, pensate ad esempio di voler inserire 10 studenti o anche più, digitare ogni volta zero per continuare diventa noioso.
Allora potremmo far decidere all’utente di terminare l’inserimento digitando una parola, ad esempio stop.
Modifichiamo dunque il programma in questo modo:
#include<stdio.h>
#include <stdlib.h>
typedef struct{
char nome[20];
char cognome[20];
int voto;
}studente;
int main(){
FILE *fp;
studente s;
char name[10];
if((fp=fopen("archivio3.txt", "wb"))==NULL) {
printf("Errore nell'apertura del file");
exit(1);
}
do{
printf("\nNome:");
scanf("%s", name);
if(strcmp(name,"stop")!=0){
strcpy(s.nome, name);
printf("Cognome:");
scanf("%s", s.cognome);
printf("Voto:");
scanf("%d", &s.voto);
fflush(stdin);
fwrite(&s, sizeof(s), 1, fp);
}
}while (strcmp(name, "stop")!=0);
fclose(fp);
return 0;
}
Chiaramente questi sono solo dei semplici esercizi, andando avanti nel tutorial proporremo altri esempi su file e strutture in C.
Alcuni link utili
Allocazione dinamica della memoria con malloc
Realizzare un menù di scelta in C
Come sommare gli elementi della cornice esterna