[DOMANDA] [C] Problema gestione file

#1
Ciao a tutti ragazzi, sto svolgendo un tema d'esame universitario e la gestione del file mi sta dando problemi. Ovviamente in mancanza del corretto funzionamento del file non posso proseguire perchè tutte le operazioni sucessive dipendono da esso. Confido in voi. Per favore non ditemi a parole la soluzione, magari se è possibile e se non chiedo troppo ditemi come posso risolvere, in codice.
Questo è il codice:

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

/*DEFINIZIONE STRUTTURE DATI*/
typedef struct Articolo {
    char codice[7];
    char nome_prodotto[63];
    char genere_alimentare[15];
    float prezzo;
    int quantita;
}TArticolo;

typedef struct NodoArticolo {
    TArticolo info;
    struct NodoArticolo *next;
}TNodoArticolo;
typedef TNodoArticolo* TListaArticoli;

typedef struct GenereAlimentare {
    char genere_alimentare[15];
    int numero_prodotti;
    TListaArticoli elenco_prodotti;
}TGenereAlimentare;

typedef struct NodoGenereAlimentare {
    TGenereAlimentare info;
    struct NodoGenereAlimentare *next;
}TNodoGenereAlimentare;
typedef TNodoGenereAlimentare* TListaGeneri;



/*DEFINIZIONE DI FUNZIONE*/
//FUNZIONE PRINCIPALE MENU'
int menu() {
    int scelta;
    printf("\t--> MENU' PRINCIPALE <--\n\n");
    printf("[1] Carica Articoli\n");
    printf("[2] Modifica Prezzo\n");
    printf("[3] Elimina Articolo\n");
    printf("[4] Copia Prodotti In Lista Generi Alimentari\n");
    printf("[5] Prezzo Medio\n");
    printf("[6] Visualizza Lista Generi Alimentari\n");
    printf("[7] Inserisci Articoli\n"); //funzione aggiuntiva
    printf("[8] Visualizza Lista Articoli\n"); //funzione aggiuntiva
    printf("[9] Esci Dal Programma\n");
    printf("Scelta: ");
    scanf("%d", &scelta);
    while (scelta < 1 || scelta > 9) {
        printf("Scelta non valida, sei pregato di inserire una scelta valida!\n");
        printf("Scelta: ");
        scanf("%d", &scelta);
        return scelta;
    }

    return scelta;
}

//Punto 1
void InserisciArticoliInListaOrdinata(TListaArticoli *lis, TArticolo elem) {
    TListaArticoli prec, curr, newnode;
    if ((newnode = (TListaArticoli)malloc(sizeof(TNodoArticolo))) == NULL) {
        printf("Errore nell'allocazione della memoria.\n");
        exit(1);
    }
    newnode->info = elem;
    prec = NULL;
    curr = *lis;
    while (curr != NULL && strcmp(curr->info.codice, elem.codice) < 0) {
        prec = curr;
        curr = curr->next;

    }
    newnode->next = curr;
    if (prec != NULL) {
        prec->next = newnode;
    }
    else {
        *lis = newnode;
    }
}

int CaricaArticoli(char *nomefile, TListaArticoli *plis) {
    FILE *f;
    TArticolo articolo;
    int numero_articoli = 0;
    if ((f = fopen(nomefile, "r")) == NULL) {
        printf("Errore nell'apertura del file.\n");
        exit(1);

    }
    *plis = NULL;
    while (!feof(f)) {
        fscanf(f, "%s", articolo.codice);
        fgets(articolo.nome_prodotto, sizeof(articolo.nome_prodotto), f);
        fgets(articolo.genere_alimentare, sizeof(articolo.genere_alimentare), f);
        articolo.genere_alimentare[strlen(articolo.genere_alimentare) - 1] = '0';
        fscanf(f, "%.2f\t", &articolo.prezzo);
        fscanf(f, "%d\n", &articolo.quantita);

        InserisciArticoliInListaOrdinata(plis, articolo);
        numero_articoli++;
    }
    fclose(f);
    return numero_articoli;
    
}


void StampaListaArticoli(TListaArticoli lis) {
    int i;
    
    for (i = 0; i < lis; i++) {
        printf("Articolo N. %d\n", i + 1);
        printf("- Codice: %s\n", lis->info.codice);
        printf("\n- Nome Prodotto: %s\n", lis->info.nome_prodotto);
        printf("- Genere Alimentare: %s\n", lis->info.genere_alimentare);
        printf("\n- Prezzo: %.2f\t", lis->info.prezzo);
        printf("Quantita': %d\n", lis->info.quantita);
        printf("--------------------->\n");
        lis = lis->next;
    }
}




/*FUNZIONE PRINCIPALE MAIN*/
int main(void) {
    TListaArticoli lista_articolo = NULL;
    TListaGeneri lista_generi = NULL;
    char nomefile[64];
    int scelta, n;
    while (scelta = menu()) {
        switch (scelta) {
        case 1:
            system("CLS");
            printf("\t---> Funzione di caricamento da file <---\n\n");
            printf("Inserisci il nome del file da cui caricare gli articoli: ");
            scanf("%s", nomefile);
            n = CaricaArticoli(nomefile, &lista_articolo);
            printf("Sono stati caricati %d articoli\n", n);
            StampaListaArticoli(lista_articolo);
            system("PAUSE");
            break;
        case 2:
            system("CLS");

            system("PAUSE");
            break;
        case 3:
            system("CLS");

            system("PAUSE");
            break;
        case 4:
            system("CLS");

            system("PAUSE");
            break;
        case 5:
            system("CLS");

            system("PAUSE");
            break;
        case 6:
            system("CLS");

            system("PAUSE");
            break;
        case 7:
            system("CLS");

            system("PAUSE");
            break;
        case 8:
            system("CLS");

            system("PAUSE");
            break;
        case 9:
            system("CLS");
            printf("Grazie per aver utilizzato questo programma <3\n");
            return 0;
            system("PAUSE");
            break;

        }
    }




    return 0;
}
 

ZioPao

Utente Attivo
189
58
Hardware Utente
CPU
i5 2500k @4.2 GHz
Dissipatore
Cooler Master Hyper 212 EVO
Scheda Madre
AsRock P67 PRO B3
Hard Disk
WD Blue 2012 1 TB + Seagate Barracuda 7200.11 + Samsung Spinpoint M7
RAM
12 GB G.Skill Ripjaws 1600MHz
Scheda Video
Gigabyte Nvidia GTX 970 G1
Scheda Audio
FiIO Olympus 2
Monitor
ASUS VE248
Alimentatore
Cooler Master GX 750W
Case
Corsair Carbide 400C
Periferiche
SuperLux HD 681 EVO, Aukey Blue Mech Keyboard, Logitech G502
Sistema Operativo
Windows 10
#2
Prima di mettermi a scavare un po, potresti essere più preciso? Cosa è che non quadra?
 
#12
Ancora non ci hai spiegato che errore ti da....
Com'è strutturato il file che dai in input? Dove sta il main?
IL file non carica come dovrebbe caricare. Per esempio: Se inserisco 4 articoli me ne ritorna 8, ovvero come se ne legge 8. Scusa avete ragione ho dimenticato di mettere la struttura del file. Come detto, in questo file ci stanno 4 prodotti e a me ne ritorna 8 quindi ci sta qualcosa di sbagliato nella funzione del caricamento file. Mentre ci sei, per favore e se non chiedo troppo, vorrei sapere perchè è sbagliato mettere system("pause"), grazie mille per il tuo aiuto lo apprezzo tantissimo.
0000001
Acqua Naturale
Bibite
0.30 200

0000012
Coca cola
Bibite
1.00 100

0000031
Biscotti ai cereali
Dolci
3.50 300

0001070
Zucchine
Frutta e verdura
1.50 50
 

Ibernato

Utente Attivo
3,426
1,545
Hardware Utente
Sistema Operativo
Windows 10 Pro
#13
IL file non carica come dovrebbe caricare. Per esempio: Se inserisco 4 articoli me ne ritorna 8, ovvero come se ne legge 8. Scusa avete ragione ho dimenticato di mettere la struttura del file. Come detto, in questo file ci stanno 4 prodotti e a me ne ritorna 8 quindi ci sta qualcosa di sbagliato nella funzione del caricamento file. Mentre ci sei, per favore e se non chiedo troppo, vorrei sapere perchè è sbagliato mettere system("pause"), grazie mille per il tuo aiuto lo apprezzo tantissimo.
0000001
Acqua Naturale
Bibite
0.30 200

0000012
Coca cola
Bibite
1.00 100

0000031
Biscotti ai cereali
Dolci
3.50 300

0001070
Zucchine
Frutta e verdura
1.50 50
Innanzitutto togli quei system pause che sono chiamate molto onerose.
Poi metti delle printf che fungono da log per capire cosa fa la funziona carica e se legge effettivamente 4 articoli
 

Discussioni Simili


Entra