Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1

    [C] leggere una struttura da file e memorizzare il contenuto in Array..

    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...

  2. #2

    Re: [C] leggere una struttura da file e memorizzare il contenuto in Array..

    Originariamente inviato da Marcolooo
    da un file
    Sicuro?
    Fracty - The Fractal Generator



    If you cannot choose a concise name that expresses what the method does, it is possible that your method is attempting to perform too many diverse tasks.

  3. #3
    Si! memorizzarlo in un array di strutture..

  4. #4
    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 );
    }
    Fracty - The Fractal Generator



    If you cannot choose a concise name that expresses what the method does, it is possible that your method is attempting to perform too many diverse tasks.

  5. #5
    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?

  6. #6
    no nessun problema..è giusto :-)

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

  8. #8
    Per cominciare hai sbagliato il tipo di ritorno delle funzioni, controlla bene, è primi_t non primo_t
    Fracty - The Fractal Generator



    If you cannot choose a concise name that expresses what the method does, it is possible that your method is attempting to perform too many diverse tasks.

  9. #9
    /* Inizializza la struttura dati */
    frutta_t * init_frutti( const unsigned size );

    Tu hai fatto cosi su, no?

    frutta_t e non frutti_t..

  10. #10
    ok ho risolto anche questo..sei un dio..

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.