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 );
}