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