-

[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
166
51
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?
 

Ibernato

Utente Attivo
2,817
1,205
Hardware Utente
CPU
i7 8700K
Dissipatore
Scythe Fuma
Scheda Madre
ASRock z370 Taichi
Hard Disk
Hd Toshiba 1TB
RAM
DDR4 16GB 3200 Corsair
Scheda Video
GTX 1080ti SuperJetStream
Monitor
Asus MG28UQ
Alimentatore
Corsair RMx 650
Case
Nzxt s340 elite bianco
Sistema Operativo
Windows 10 Pro
#6
ragazzi è il file che non quadra infatti carica in modo errato gli articoli nella lista.
Ma ti da qualche errore di compilazione?
Non ho capito ancora...
Com'è strutturato sto file?
 

Ibernato

Utente Attivo
2,817
1,205
Hardware Utente
CPU
i7 8700K
Dissipatore
Scythe Fuma
Scheda Madre
ASRock z370 Taichi
Hard Disk
Hd Toshiba 1TB
RAM
DDR4 16GB 3200 Corsair
Scheda Video
GTX 1080ti SuperJetStream
Monitor
Asus MG28UQ
Alimentatore
Corsair RMx 650
Case
Nzxt s340 elite bianco
Sistema Operativo
Windows 10 Pro
#8
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:
Oddio, non l'avevo notato ahahah.
 

Ibernato

Utente Attivo
2,817
1,205
Hardware Utente
CPU
i7 8700K
Dissipatore
Scythe Fuma
Scheda Madre
ASRock z370 Taichi
Hard Disk
Hd Toshiba 1TB
RAM
DDR4 16GB 3200 Corsair
Scheda Video
GTX 1080ti SuperJetStream
Monitor
Asus MG28UQ
Alimentatore
Corsair RMx 650
Case
Nzxt s340 elite bianco
Sistema Operativo
Windows 10 Pro
#11
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?
 
#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
2,817
1,205
Hardware Utente
CPU
i7 8700K
Dissipatore
Scythe Fuma
Scheda Madre
ASRock z370 Taichi
Hard Disk
Hd Toshiba 1TB
RAM
DDR4 16GB 3200 Corsair
Scheda Video
GTX 1080ti SuperJetStream
Monitor
Asus MG28UQ
Alimentatore
Corsair RMx 650
Case
Nzxt s340 elite bianco
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
 

Ibernato

Utente Attivo
2,817
1,205
Hardware Utente
CPU
i7 8700K
Dissipatore
Scythe Fuma
Scheda Madre
ASRock z370 Taichi
Hard Disk
Hd Toshiba 1TB
RAM
DDR4 16GB 3200 Corsair
Scheda Video
GTX 1080ti SuperJetStream
Monitor
Asus MG28UQ
Alimentatore
Corsair RMx 650
Case
Nzxt s340 elite bianco
Sistema Operativo
Windows 10 Pro
#15
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
 

Discussioni Simili


Entra