DOMANDA [C] Problema gestione file

saro1995

Nuovo Utente
82
3
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
CPU
i5 2500k @4.2 GHz
Dissipatore
Cooler Master Hyper 212 EVO
Scheda Madre
AsRock P67 PRO B3
HDD
WD Blue 2012 1 TB + Seagate Barracuda 7200.11 + Samsung Spinpoint M7
RAM
12 GB G.Skill Ripjaws 1600MHz
GPU
Gigabyte Nvidia GTX 970 G1
Audio
FiIO Olympus 2
Monitor
ASUS VE248
PSU
Cooler Master GX 750W
Case
Corsair Carbide 400C
Periferiche
SuperLux HD 681 EVO, Aukey Blue Mech Keyboard, Logitech G502
OS
Windows 10
Prima di mettermi a scavare un po, potresti essere più preciso? Cosa è che non quadra?
 

BAT

Moderatore
Staff Forum
Utente Èlite
22,670
11,453
CPU
1-Neurone
Dissipatore
Ventaglio
RAM
Scarsa
Net
Segnali di fumo
OS
Windows 10000 BUG
System("PAUSE") su un compito universitario? :patpat: AAAAAAAAAARRGGGGHHHH
Se lo fai davvero poi non ti meravigliare se ti bocciano anche se sulla carta funziona tutto... :mad:
 
  • Mi piace
Reazioni: Ibernato

saro1995

Nuovo Utente
82
3
Questo sistema del system "cls" e system pause lho visto fare in un video su Youtube. Comunque adesso che lo so uso il ciclo do while. Ragazzi avete visionato il file?
 

Ibernato

Utente Èlite
4,328
2,047
OS
Windows 10 Pro / Ubuntu 22.04
Questo sistema del system "cls" e system pause lho visto fare in un video su Youtube. Comunque adesso che lo so uso il ciclo do while. Ragazzi avete visionato il file?
Ancora non ci hai spiegato che errore ti da....
Com'è strutturato il file che dai in input? Dove sta il main?
 

saro1995

Nuovo Utente
82
3
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 Èlite
4,328
2,047
OS
Windows 10 Pro / Ubuntu 22.04
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
 

saro1995

Nuovo Utente
82
3
ho tolto il system pause e adesso e ho proceduto con il ciclo do while. Comunque cosa intendi " con delle printf che fungono da log " ? Mostrami un esempio in codice se puoi pls
 

Ibernato

Utente Èlite
4,328
2,047
OS
Windows 10 Pro / Ubuntu 22.04
ho tolto il system pause e adesso e ho proceduto con il ciclo do while. Comunque cosa intendi " con delle printf che fungono da log " ? Mostrami un esempio in codice se puoi pls
nella chiamata caricafile, all'interno del ciclo, stampa gli articoli che prendi e vedi cosa ti da
 

Ci sono discussioni simili a riguardo, dai un'occhiata!

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili