Creare i file persona.h e persona.c che consentano di utilizzare la seguente struttura:
struct persona { int anni; char nome[50]; };
e la seguente funzione:
extern struct persona *leggi_persone(const char *filename, size_t *size);
La funzione riceve in input un nome di file filename che deve aprire in modalità lettura tradotta (testo). Se il file esiste, legge dal file sequenze di caratteri che descrivono delle persone e la loro età.
Nel file è indicato, come primo valore, un numero intero che rappresenta il numero totale di persone elencate nel file seguito da un a capo. Successivamente, su ogni riga sono presenti i dati delle persone nel seguente formato:
Zero o più spazi o tab.
Un numero intero che indica l’età della persona.
Zero o più spazi o tab.
Il carattere virgola
Zero o più spazi o tab.
Una stringa che può contenere spazi e tab che rappresenta il nome della persona.
Un a capo.
Quello che segue è un esempio corretto di file:
3↵ 18 , Marco Rossi↵ 22 , Luca Verdi↵ 25, Marcello Bianchi↵
La funzione deve allocare dinamicamente sull’heap spazio sufficiente a contenere tutte le persone leggibili correttamente dal file, riempirlo con i valori opportuni, impostare la variabile puntata da size a questo numero e infine ritornare un puntatore all’area così allocata.
Se è impossibile aprire il file, questo non contiene nulla o si verifica un errore durante la lettura, ad esempio nel file ci sono meno persone di quelle indicate dal primo numero intero, la funzione ritorna NULL e imposta la variabile puntata da size a 0.
Il codice che ho creato fuzniona quasi perfettamente eccetto che per i controlli non sono in grado di arrestare nel caso il file è vuoto non esiste eccetera sapreste aiutarmi?
posto il codice
codice:
#include"persona.h"
#include<string.h>
extern struct persona *leggi_persone(const char *filename, size_t *size) {
FILE *f = fopen(filename, "rt");
if (f == NULL)
{
*size = 0;
return NULL;
fclose(f);
}
char p[50];
size_t nrighe;
struct persona *ret;
fscanf(f, "%i", &nrighe);
if (nrighe == 0)
{
*size = 0;
return NULL;
}
ret = malloc(sizeof(struct persona)*nrighe);
for (size_t i = 0; i < nrighe; i++) {
if (!feof(f)) {
fscanf(f, "%i ,", &ret[i].anni);
fgets(p, 50, f);
strcpy(ret[i].nome, p);
}
else return NULL;
}
fclose(f);
*size = nrighe;
return ret;
}