Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Programma gestione magazzino
Forum - C/C++ - Programma gestione magazzino

Avatar
crazyso91 (Normal User)
Newbie


Messaggi: 3
Iscritto: 27/04/2012

Segnala al moderatore
Postato alle 16:45
Domenica, 03/06/2012
salve sn nuova ho un problema si segmentazione con il programma... qnd cancello un elemento dalla lista se il programma non ha già caricato il file "magazzino.txt" tutto procebe benissimo ma qnd io carico il file... già scritto... e vado a cancellare un elemento... mi da errore di segmentazione... perchè almeno da qll che ho cpt dovrei fare una funzione per cancellare un elemento dal file oppure nella funzione cancella mi dovrebbe salvare il file con sovrascrittura ma nn arrivo a capire come dovrei fare... qst è il programma
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

struct magazzino{
    
    char ricambio[50];
    int pezzi;
    struct magazzino *next;
};

typedef struct magazzino nodo;

int menu();
void stampa_inventario(nodo *);
int conta_elementi(nodo *);
int conta_pezzi_totali(nodo *);
nodo *aggiungi_ricambio(nodo *);
nodo *trova_elemento(char *, nodo *);
void stampa_lista(nodo*);
void ricerca_ricambio(nodo*);
nodo *cancella_elemento(nodo *);
int prelievo_pezzi(nodo*);
int deposito_pezzi(nodo*);
nodo *cancella_lista(nodo *);
nodo *crea_lista_da_file(nodo *);
void salva_lista_su_file(nodo *);

int main(){
    
    nodo *start=NULL;
            
        printf("\n");
        stampa_inventario(start);
        printf("\n\n");
        
        printf("Benvenuto\n");
    while(1){
        switch(menu()){
                case 1:     start=aggiungi_ricambio(start);
                        stampa_inventario(start);
                        break;
                case 2:        start=cancella_elemento(start);
                        stampa_inventario(start);
                        break;
                case 3:     stampa_lista(start);
                        stampa_inventario(start);
                        break;
                case 4:        ricerca_ricambio(start);
                        stampa_inventario(start);
                                            break;
                case 5:        prelievo_pezzi(start);
                        stampa_inventario(start);
                        break;
                case 6:     deposito_pezzi(start);
                        stampa_inventario(start);
                        break;
                case 7:     start=cancella_lista(start);
                        stampa_inventario(start);
                        break;
                case 8:     start=crea_lista_da_file(start);
                        stampa_inventario(start);
                                            break;
                case 9:        salva_lista_su_file(start);
                        stampa_inventario(start);    
                        break;
                case 0:        cancella_lista(start);
                        printf("Arrivederci!\n");
                        exit(0);
                default: printf("Errore\n");


            }
        

        }
    
}

void salva_lista_su_file(nodo *start){

    nodo *head=start;
    int a=0;
    FILE *fp=fopen("inventario.txt", "o");                //Memorizza l'inventario nel file di testo.

    while(head!=NULL){                        //Scelta 9)save.
        fprintf(fp, "%s %d\n", head->ricambio, head->pezzi);
        head=head->next;
        a++;
    }
    if(a>0){
        printf("Salvataggio effettuato.\n");
    }else{
        printf("Salvataggio non riuscito.\n");
    }
    fclose(fp);
}


nodo *crea_lista_da_file(nodo *start){

        FILE *fp;
        nodo *nuovo;
    nodo *temp;
        char nome_prodotto[64];
        int quantita;
    char z='a';

    fp=fopen("inventario.txt", "r");                                //Crea la lista mentre legge i file, aggiungendo gli elementi in coda.
        if(!fp){                            //Scelta 8)load.
                printf("Caricamento non effettuato.\n\n");
                return NULL;
        }
    if(start!=NULL){
        while((z!='s')&&(z!='n')){
            printf("Vuoi sovrascrivere? Si o No? ");            //Qui avviene doppia stampa.???
            scanf("%c", &z);
        }
    }

        while(feof(fp)==0){
                nuovo=(nodo *)malloc(sizeof(nodo));
                fscanf(fp, "%s %d\n", nome_prodotto, &quantita);
                nuovo->pezzi=quantita;
                strcpy(nuovo->ricambio, nome_prodotto);
                temp=start;
        nuovo->next=temp;
        start=nuovo;
        }
    if(feof(fp)!=0){
        printf("Caricamento effettuato.\n\n");
    }
        fclose(fp);
        return start;

}

nodo *cancella_lista(nodo *start){

    if(start!=NULL){
        cancella_lista(start->next);                //Cancella la lista quando chiudi il programma o quando devi rimuovere tutto.
        free(start);                        //Scelta 7)rimuovi tutto e 0)esci.
    }
    return NULL;
}


int deposito_pezzi(nodo *start){

    char nome[64];
    nodo *temp;
    int pr;                                //Per effettuare il deposito di pezzi.
                                    //Scelta 6)deposito.
    printf("Di quale pezzo vuoi fare il deposito?\n");
    scanf("%s", nome);
    temp=trova_elemento(nome, start);
    if(temp==NULL){
        printf("Ricambio non trovato.\n\n");
        return 0;
    }
    printf("Quanti pezzi depositi?\n ");
    scanf("%d", &pr);
    temp->pezzi=temp->pezzi+pr;
    printf("Operazione effettuata.\n\n");
    return 0;
}

int prelievo_pezzi(nodo* start){
    char nome[50];
        nodo *temp;
        int pr;

        printf("Di quale pezzo vuoi fare il prelievo?\n");
        scanf("%s", nome);                        //Per effettuare il prelievo di pezzi.
        temp=trova_elemento(nome, start);                //Scelta 5)prelievo.
    if(temp==NULL){
        printf("Ricambio non trovato.\n\n");
        return 0;
    }
        printf("Quanti pezzi? \n");
        scanf("%d", &pr);
        while(pr>temp->pezzi){
                printf("N. pezzi da prelevare maggiore del n. pezzi in magazzino. Inserire numero corretto: \n");
                scanf("%d", &pr);
        }
        temp->pezzi=temp->pezzi-pr;
    printf("Operazione effettuata.\n\n");

}

void ricerca_ricambio(nodo *start){

    char nome[50];
    nodo *temp;

    printf("Quale ricambio cerchi?\n ");                //Cerca un ricambio e se lo trova stampa il numero di pezzi.
    scanf("%s", nome);                        //Scelta 4)trova.
    temp=trova_elemento(nome, start);
    if(temp==NULL){
        printf("Il ricambio %s non è in inventario\n\n", nome);
    }else{
        printf("%s: n. pezzi disponibili: %d\n", temp->ricambio, temp->pezzi);
    }

}

void stampa_lista(nodo *start){

    if(start==NULL){
        printf("Fine\n\n");                    //Stampa la lista ricorsivamente.
    }else{                                //Scelta 3)mostra.
        printf("%s: %d pezzi\n", start->ricambio, start->pezzi);
        stampa_lista(start->next);
    }
}


nodo *cancella_elemento(nodo *start){

    char nome[50];
    nodo *temp;
    nodo *head;
    printf("Quale pezzo di ricambio vuoi cancellare?\n ");
    scanf("%s", nome);                        //Scaneffizzando il nome del ricambio ti fa trovare e cancellare il nodo che contiene il ric.
    temp=trova_elemento(nome, start);                //Scelta 2)cancella.
    if(temp==NULL){
        printf("Ricambio non trovato.\n\n");
        return start;
    }
    head=start;
    if(head==temp){
        head=temp->next;
        free(temp);
        printf("Ricambio eliminato.\n\n");
    }
    while(head->next!=temp){
        head=head->next;
    }
    if(head->next==temp){
        head->next=temp->next;
        free(temp);
        printf("Ricambio eliminato.\n\n");
    }else{
        printf("Ricambio non trovato.\n\n");
    }
    return head;
}

nodo *aggiungi_ricambio(nodo *start){

nodo* head;
char nome_pezzo[50];
int quantita;
nodo *temp=start;

    printf("Che tipo di ricambio verrà aggiunto?\n");
    scanf("%s", nome_pezzo);
    
    if(trova_elemento(nome_pezzo, start)!=NULL){
        temp=trova_elemento(nome_pezzo, start);
        printf("L'elemento esiste già, quanti pezzi vuoi aggiungere? ");
        scanf("%d", &quantita);
        while(quantita<0){
            printf("I numeri negativi non sono validi, quanti pezzi vuoi aggiungere? ");
            scanf("%d", &quantita);
        }    
        
        temp->pezzi=temp->pezzi+quantita;
        return start;
    }
            printf("Quanti pezzi? ");                    //Aggiunge un nodo per inserire un elemento in magazzino.
            scanf("%d", &quantita);                        //Scelta 1)aggiungi.
                while(quantita<0){
                printf("I numeri negativi non sono validi, quanti pezzi vuoi aggiungere? ");            //Qui non avviene doppia stampa.
                scanf("%d", &quantita);
                }    
                    head=(nodo *)malloc(sizeof(nodo));
                        if(head){
                            strcpy(head->ricambio, nome_pezzo);
                            head->pezzi=quantita;
                            head->next=start;
                        }
    return head;
}
    



nodo *trova_elemento(char nome[50], nodo *start){

    nodo *temp;
    temp=start;

    while(temp!=NULL){                        //Fornendo il nome del ricambio ti fa trovare il nodo che contiene quel ricambio.
        if(strcmp(temp->ricambio, nome)==0){            //Si trova in cancella_elemento, prelievo_pezzi, deposito_pezzi e ricerca_ricambio.
            return temp;
        }else{
            temp=temp->next;
        }
    }
    return temp;
}

void stampa_inventario(nodo *start){
    
    printf("Tipi di ricambi: %d. Numero totale di pezzi di ricambio: %d.\n", conta_elementi(start), conta_pezzi_totali(start));
    
}

int menu(){
    int sc;
    printf("Menu: \n1)aggiungi\n2)cancella\n3)mostra\n4)trova\n5)prelievo\n6)deposito\n7)rimuovi tutto\n8)load\n9)save\n0)esci\n");
    scanf("%d", &sc);
    return sc;
}

int conta_elementi(nodo *start){
    if(start==NULL){
        return 0;                        //Conta ricors. gli elementi. Usato in stampa_inventario.
    }else{
        return (1 + conta_elementi(start->next));
    }

}

int conta_pezzi_totali(nodo *start){

int pezzi_totali;

    if(start==NULL){                        //Conta il numero di pezzi in magazzino. Usato in stampa_inventario.
        pezzi_totali=0;
        return pezzi_totali;
    }else{
        pezzi_totali=start->pezzi;
        return(pezzi_totali + conta_pezzi_totali(start->next));
    }

}

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 17:41
Domenica, 03/06/2012
Nella fopen in scrittura non esiste il modo "o" ... deve essere "w"


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
crazyso91 (Normal User)
Newbie


Messaggi: 3
Iscritto: 27/04/2012

Segnala al moderatore
Postato alle 18:06
Domenica, 03/06/2012
si anche cn 'w' da errore cmq... nn so come sia spuntata quella 'o' XD  

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 18:19
Domenica, 03/06/2012
L'errore probabilmente è nel ciclo di lettura dei dati da file ... fai un po' di debugging


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
crazyso91 (Normal User)
Newbie


Messaggi: 3
Iscritto: 27/04/2012

Segnala al moderatore
Postato alle 19:12
Domenica, 03/06/2012
altri consigli? XD

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 20:17
Domenica, 03/06/2012
Hai già controllato quello che ti ho detto?

Fammi un esempio di file di testo che ti dà il problema.
Non genericamente, ma esattamente un esempio di file che genera l'errore.

Ultima modifica effettuata da nessuno il 03/06/2012 alle 20:31


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote