codice:/* * Leggere da file una struttura dati frutta * * Il file contiene informazioni del tipo: * <nome> <calorie> <prezzo> */ #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_CHARS 100 /* Data structure */ typedef struct frutta frutta_t; struct frutta { char *nome; unsigned calorie; float prezzo; }; /* Inizializza la struttura dati */ frutta_t * init_frutti( const unsigned size ); /* Legge il file con i dati dei frutti */ frutta_t * read_frutti( unsigned *nFrutti ); /* Rilascia la memoria allocata per la struttura dati */ void free_frutti( frutta_t *frutti ); /* Stampa i dati */ void print_frutti( const frutta_t *frutti, const unsigned nFrutti, const char *output ); /* Main */ int main() { frutta_t *frutti = NULL; /* Puntatore ad una struttura frutta_t */ unsigned nFrutti; /* Numero di frutti */ if( (frutti = read_frutti(&nFrutti)) != NULL ) { print_frutti( frutti, nFrutti, "stdout" ); free_frutti( frutti ); } getchar(); return 0; } /* Stampa i dati */ void print_frutti( const frutta_t *frutti, const unsigned nFrutti, const char *output ) { unsigned i; /* Console */ if( !strncmp(output, "stdout", strlen("stdout")) ) { printf( "\nFrutti:\n\n" ); for( i = 0; i != nFrutti; ++i ) printf( "Nome: %s - Calorie: %u - Prezzo %.2f\n", frutti[i].nome, frutti[i].calorie, frutti[i].prezzo ); putchar('\n'); } /* File */ else { FILE *fileptr = fopen( output, "wt" ); if( fileptr == NULL ) { perror( "impossibile aprire il file di output: " ); return; } fprintf( fileptr, "\nFrutti:\n\n" ); for( i = 0; i != nFrutti; ++i ) fprintf( fileptr, "Nome: %s - Calorie: %u - Prezzo %.2f\n", frutti[i].nome, frutti[i].calorie, frutti[i].prezzo ); fclose( fileptr ); } } /* Legge il file con i dati dei frutti */ frutta_t * read_frutti( unsigned *nFrutti ) { char buffer[ MAX_CHARS ]; FILE *fileptr = NULL; printf( "Nome del file? " ); scanf( "%s%*c", buffer ); fileptr = fopen( buffer, "rt" ); if( fileptr != NULL ) { frutta_t *frutti = NULL; /* Determina la dimensione dell'array con una prima lettura del file */ *nFrutti = 0; while( fgets(buffer, MAX_CHARS, fileptr) != NULL ) ++(*nFrutti); rewind( fileptr ); if( (frutti = init_frutti(*nFrutti)) != NULL ) { char nome[ MAX_CHARS ]; unsigned i; for( i = 0; i != *nFrutti; ++i ) { fscanf( fileptr, "%s %u %f", nome, &frutti[i].calorie, &frutti[i].prezzo ); frutti[i].nome = strdup( nome ); } fclose( fileptr ); return frutti; } fclose( fileptr ); } return NULL; } /* Inizializza la struttura dati */ frutta_t * init_frutti( const unsigned size ) { frutta_t *frutti = (frutta_t *) malloc( size * sizeof(frutta_t) ); if( frutti == NULL ) return NULL; return frutti; } /* Rilascia la memoria allocata per la struttura dati */ void free_frutti( frutta_t *frutti ) { if( frutti != NULL ) free( frutti ); }