PDA

Visualizza la versione completa : [C] Leggere una struttura da file e memorizzare il contenuto in un Array


Marcolooo
14-02-2011, 15:40
il mio problema questo: dovrei andare a leggere un struttura del genere:

ARANCIA 62 FRUTTA 0.50
CILIEGIE 98 FRUTTA 0.80
UVA 143 FRUTTA 1.20
ANANAS 80 FRUTTA 1.50

da un file e andarlo a memorizzare su un array di strutture.
Ho scritto questo di codice ma quando avvio il programma non va:

#include<stdio.h>
#include<stdlib.h>
#define MAX 30
main()
{
int i;
FILE *f1;
struct menu
{
char nome[MAX];
float calorie;
char tipo[MAX];
float prezzo;
};
typedef struct menu primi;
primi stock[4];
f1 = fopen("Frutta.txt", "r");
if (f1 == NULL) {
printf("Errore durante l'apertura del file.\n");
exit(0);
}
for(i=0;i<4;i++)
{scanf("%s",&stock[i].nome);
scanf("%f",&stock[i].calorie);
scanf("%s",&stock[i].tipo);
scanf("%f",&stock[i].prezzo);
}
printf("Ecco il menu' della frutta:\n");
printf("Nome\t Calorie\t Tipo\t Prezzo\n");
for(i=0;i<4;i++)
{
printf("%s",stock[i].nome);
printf("\t");
printf("%f",stock[i].calorie);
printf("\t");
printf("%s",stock[i].tipo);
printf("\t");
printf("%f",stock[i].prezzo);
printf("\t");
printf("\n\n");
}
fclose(f1);
system ("Pause");
}

grazie


p.s. in questo caso non sar "menu primi" ma menu frutta...

GliderKite
14-02-2011, 16:25
Originariamente inviato da Marcolooo
da un file

Sicuro?

Marcolooo
14-02-2011, 21:26
Si! memorizzarlo in un array di strutture..

GliderKite
14-02-2011, 23:24
/*
* 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 );
}

Marcolooo
15-02-2011, 13:03
Inanzitutto grazie mille per l'aiuto.

Io ho provato a modificare la struttura all'interno del file da leggere in quanto mancava il tipo di cibo, ma non importa. quindi diventata cosi.

ARANCIA 62 0.50[prima struc]
CILIEGIE 98 0.80[seconda stuct]
UVA 143 1.20[terza struct]
ANANAS 80 1.50[quarta struct]

ma secondo me ha qualche problema nella lettura, pu darsi?

Marcolooo
15-02-2011, 13:16
no nessun problema.. giusto :-)

Marcolooo
15-02-2011, 16:59
Ho provato a fare la stessa cosa per dolci primi e secondi..ma mi da un errore:
45 C:\Documents and Settings\amministratore\Desktop\prova1\SenzaTitolo 1.cpp expected constructor, destructor, or type conversion before '*' token, subito dopo aver dichiarato le strutture..
(solo i commenti hanno lo stesso nome all'interno li ho sistemati io)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


#define MAX_CHARS 100


/* Data structure */
typedef struct frutta primi_t;
typedef struct frutta secondi_t;
typedef struct frutta frutta_t;
typedef struct frutta dolci_t;
struct primi
{
char *nome;
unsigned calorie;
char *tipo;
float prezzo;
};
struct secondi
{
char *nome;
unsigned calorie;
char *tipo;
float prezzo;
};
struct frutta
{
char *nome;
unsigned calorie;
char *tipo;
float prezzo;
};
struct dolci
{
char *nome;
unsigned calorie;
char *tipo;
float prezzo;
};


/* Inizializza la struttura dati */
primo_t * init_primo( const unsigned size );
/* Inizializza la struttura dati */
secondo_t * init_secondi( const unsigned size );
/* Inizializza la struttura dati */
frutta_t * init_frutti( const unsigned size );
/* Inizializza la struttura dati */
dolce_t * init_dolci( const unsigned size );

/* Legge il file con i dati dei frutti */
primo_t * read_primi( unsigned *nPrimi );
/* Legge il file con i dati dei frutti */
secondo_t * read_secondi( unsigned *nSecondi );
/* Legge il file con i dati dei frutti */
frutta_t * read_frutti( unsigned *nFrutti );
/* Legge il file con i dati dei frutti */
dolce_t * read_dolci( unsigned *nDolci );

/* Rilascia la memoria allocata per la struttura dati */
void free_primi( primo_t *primi );
/* Rilascia la memoria allocata per la struttura dati */
void free_secondi( secondo_t *secondi );
/* Rilascia la memoria allocata per la struttura dati */
void free_frutti( frutta_t *frutti );
/* Rilascia la memoria allocata per la struttura dati */
void free_dolci( dolce_t *dolci );

/* Stampa i dati */
void print_primi( const primo_t *primi, const unsigned nPrimi, const char *output );
/* Stampa i dati */
void print_secondi( const secondo_t *secondi, const unsigned nSecondi, const char *output );
/* Stampa i dati */
void print_frutti( const frutta_t *frutti, const unsigned nFrutti, const char *output );
/* Stampa i dati */
void print_dolci( const dolce_t *dolci, const unsigned nDolci, const char *output );



/* Main */
int main()
{
primo_t *primi = NULL; /* Puntatore ad una struttura frutta_t */
unsigned nPrimi; /* Numero di frutti */

if( (primi = read_primi(&nPrimi)) != NULL )
{
print_primi( primi, nPrimi, "stdout" );
free_primi( primi );
}

{
secondo_t *secondi = NULL; /* Puntatore ad una struttura frutta_t */
unsigned nSecondi; /* Numero di frutti */

if( (secondi = read_secondi(&nSecondi)) != NULL )
{
print_secondi( secondi, nSecondi, "stdout" );
free_secondi( secondi );
}

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

{
dolce_t *dolci = NULL; /* Puntatore ad una struttura frutta_t */
unsigned nDolci; /* Numero di frutti */

if( (dolci = read_dolci(&ndolci)) != NULL )
{
print_dolci( dolci, nDolci, "stdout" );
free_dolci( dolci );
}



system("Pause");
}



/* Stampa i dati */
void print_primi( const primo_t *primi, const unsigned nPrimi, const char *output )
{
unsigned i;
/* Stampa i dati */
void print_secondi( const secondo_t *secondi, const unsigned nSecondi, const char *output )
{
unsigned i;
/* Stampa i dati */
void print_frutti( const frutta_t *frutti, const unsigned nFrutti, const char *output )
{
unsigned i;
/* Stampa i dati */
void print_dolci( const dolce_t *dolci, const unsigned nDolci, const char *output )
{
unsigned i;

/* Console */
if( !strncmp(output, "stdout", strlen("stdout")) )
{
printf( "\nPrimi:\n\n" );

for( i = 0; i != nPrimi; ++i )
printf( "Nome: %s - Calorie: %u - Tipo: %s - Prezzo %.2f\n", primi[i].nome,
primi[i].calorie, primi[i].tipo, primi[i].prezzo );

putchar('\n');
}
/* Console */
if( !strncmp(output, "stdout", strlen("stdout")) )
{
printf( "\nSecondi:\n\n" );

for( i = 0; i != nSecondi; ++i )
printf( "Nome: %s - Calorie: %u - Tipo: %s - Prezzo %.2f\n", Secondi[i].nome,
Secondi[i].calorie, Secondi[i].tipo, Secondi[i].prezzo );

putchar('\n');
}
/* Console */
if( !strncmp(output, "stdout", strlen("stdout")) )
{
printf( "\nFrutti:\n\n" );

for( i = 0; i != nFrutti; ++i )
printf( "Nome: %s - Calorie: %u - Tipo: %s - Prezzo %.2f\n", frutti[i].nome,
frutti[i].calorie, frutti[i].tipo, frutti[i].prezzo );

putchar('\n');
}
/* Console */
if( !strncmp(output, "stdout", strlen("stdout")) )
{
printf( "\nDolci:\n\n" );

for( i = 0; i != nDolci; ++i )
printf( "Nome: %s - Calorie: %u - Tipo: %s - Prezzo %.2f\n", dolci[i].nome,
dolci[i].calorie, dolci[i].tipo, dolci[i].prezzo );

putchar('\n');
}

/* File */
else
{
FILE *fileptr = fopen( output, "wt" );

if( fileptr == NULL )
{
perror( "impossibile aprire il file di output: " );
return;
}

fprintf( fileptr, "\nPrimi:\n\n" );

for( i = 0; i != nPrimi; ++i )
fprintf( fileptr, "Nome: %s - Calorie: %u - Tipo: %s - Prezzo %.2f\n", primi[i].nome,
primi[i].calorie, primi[i].tipo, primi[i].prezzo );

fclose( fileptr );
}
}
/* File */
else
{
FILE *fileptr = fopen( output, "wt" );

if( fileptr == NULL )
{
perror( "impossibile aprire il file di output: " );
return;
}

fprintf( fileptr, "\nSecondi:\n\n" );

for( i = 0; i != nSecondi; ++i )
fprintf( fileptr, "Nome: %s - Calorie: %u - Tipo: %s - Prezzo %.2f\n", secondi[i].nome,
secondi[i].calorie, secondi[i].tipo, secondi[i].prezzo );

fclose( fileptr );
}
}
/* 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 - Tipo: %s - Prezzo %.2f\n", frutti[i].nome,
frutti[i].calorie, frutti[i].tipo, frutti[i].prezzo );

fclose( fileptr );
}
}
/* File */
else
{
FILE *fileptr = fopen( output, "wt" );

if( fileptr == NULL )
{
perror( "impossibile aprire il file di output: " );
return;
}

fprintf( fileptr, "\nDolci:\n\n" );

for( i = 0; i != nDolci; ++i )
fprintf( fileptr, "Nome: %s - Calorie: %u - Tipo: %s - Prezzo %.2f\n", dolci[i].nome,
dolci[i].calorie, dolci[i].tipo, dolci[i].prezzo );

fclose( fileptr );
}
}




/* Legge il file con i dati dei primi */
primo_t * read_primi( unsigned *nPrimi )
{
char buffer[ MAX_CHARS ];
FILE *fileptr = NULL;

printf( "Nome del file? " );
scanf( "%s%*c", buffer );

fileptr = fopen( buffer, "rt" );

if( fileptr != NULL )
{
primo_t *primi = NULL;

/* Legge il file con i dati dei secondi */
secondo_t * read_secondi( unsigned *nSecondi )
{
char buffer[ MAX_CHARS ];
FILE *fileptr = NULL;

printf( "Nome del file? " );
scanf( "%s%*c", buffer );

fileptr = fopen( buffer, "rt" );

if( fileptr != NULL )
{
secondo_t *secondi = NULL;
/* 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;
/* Legge il file con i dati dei frutti */
dolce_t * read_dolci( unsigned *nDolci )
{
char buffer[ MAX_CHARS ];
FILE *fileptr = NULL;

printf( "Nome del file? " );
scanf( "%s%*c", buffer );

fileptr = fopen( buffer, "rt" );

if( fileptr != NULL )
{
dolce_t *dolci = NULL;

/* Determina la dimensione dell'array con una prima lettura del file */
*nPrimi = 0;
while( fgets(buffer, MAX_CHARS, fileptr) != NULL )
++(*nPrimi);

rewind( fileptr );

if( (primi = init_primi(*nprimi)) != NULL )
{
char nome[ MAX_CHARS ];
char tipo[ MAX_CHARS ];
unsigned i;

for( i = 0; i != *nPrimi; ++i )
{
fscanf( fileptr, "%s %u %s %f", nome, &primi[i].calorie, tipo, &primi[i].prezzo );
primi[i].nome = strdup( nome );
primi[i].tipo = strdup( tipo );
}

fclose( fileptr );

return primi;
}

fclose( fileptr );
}

return NULL;
}
/* Determina la dimensione dell'array con una prima lettura del file */
*nSecondi = 0;
while( fgets(buffer, MAX_CHARS, fileptr) != NULL )
++(*nSecondi);

rewind( fileptr );

if( (secondi = init_secondi(*nSecondi)) != NULL )
{
char nome[ MAX_CHARS ];
char tipo[ MAX_CHARS ];
unsigned i;

for( i = 0; i != *nFrutti; ++i )
{
fscanf( fileptr, "%s %u %s %f", nome, &secondi[i].calorie, tipo, &secondi[i].prezzo );
secondi[i].nome = strdup( nome );
secondi[i].tipo = strdup( tipo );
}

fclose( fileptr );

return secondi;
}

fclose( fileptr );
}

return 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 ];
char tipo[ MAX_CHARS ];
unsigned i;

for( i = 0; i != *nFrutti; ++i )
{
fscanf( fileptr, "%s %u %s %f", nome, &frutti[i].calorie, tipo, &frutti[i].prezzo );
frutti[i].nome = strdup( nome );
frutti[i].tipo = strdup( tipo );
}

fclose( fileptr );

return frutti;
}

fclose( fileptr );
}

return NULL;
}
/* Determina la dimensione dell'array con una prima lettura del file */
*nDolci = 0;
while( fgets(buffer, MAX_CHARS, fileptr) != NULL )
++(*nDolci);

rewind( fileptr );

if( (frutti = init_frutti(*nDolci)) != NULL )
{
char nome[ MAX_CHARS ];
char tipo[ MAX_CHARS ];
unsigned i;

for( i = 0; i != *nDolcii; ++i )
{
fscanf( fileptr, "%s %u %s %f", nome, &dolci[i].calorie, tipo, &dolci[i].prezzo );
dolci[i].nome = strdup( nome );
dolci[i].tipo = strdup( tipo );
}

fclose( fileptr );

return dolci;
}

fclose( fileptr );
}

return NULL;
}



/* Inizializza la struttura dati */
primo_t * init_primi( const unsigned size )
{
primo_t *primi = (primo_t *) malloc( size * sizeof(primo_t) );

if( primi == NULL )
return NULL;

return primi;
}
/* Inizializza la struttura dati */
secondo_t * init_secondi( const unsigned size )
{
secondo_t *secondi = (secondo_t *) malloc( size * sizeof(secondo_t) );

if( frutti == NULL )
return NULL;

return secondi;
}
/* 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;
}
/* Inizializza la struttura dati */
dolce_t * init_dolci( const unsigned size )
{
dolce_t *dolci = (dolce_t *) malloc( size * sizeof(dolce_t) );

if( frutti == NULL )
return NULL;

return dolce;
}


/* Rilascia la memoria allocata per la struttura dati */
void free_frutti( primo_t *primi )
{
if( primi != NULL )
free( primi );
}
/* Rilascia la memoria allocata per la struttura dati */
void free_secondi( secondo_t *secondi )
{
if( secondi != NULL )
free( secondi );
}
/* Rilascia la memoria allocata per la struttura dati */
void free_frutti( frutta_t *frutti )
{
if( frutti != NULL )
free( frutti );
}
/* Rilascia la memoria allocata per la struttura dati */
void free_dolci( dolce_t *dolci )
{
if( dolci != NULL )
free( dolci );
}

GliderKite
15-02-2011, 17:11
Per cominciare hai sbagliato il tipo di ritorno delle funzioni, controlla bene, primi_t non primo_t

Marcolooo
15-02-2011, 17:21
/* Inizializza la struttura dati */
frutta_t * init_frutti( const unsigned size );

Tu hai fatto cosi su, no?

frutta_t e non frutti_t..

Marcolooo
15-02-2011, 17:25
ok ho risolto anche questo..sei un dio..

Loading