Oppure

Loading
03/06/12 14:45
crazyso91
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));
    }

}
aaa
03/06/12 15:41
nessuno
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à.
03/06/12 16:06
crazyso91
si anche cn 'w' da errore cmq... nn so come sia spuntata quella 'o' XD
aaa
03/06/12 16:19
nessuno
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à.
03/06/12 17:12
crazyso91
altri consigli? XD
aaa
03/06/12 18:17
nessuno
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 03/06/12 18: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à.