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