Ragazzi ma proprio nessuno risponde, lo so che sarebbe formativo riuscirci da solo ma non ci riesco ed è circa 10 ore che ci provo.
Ragazzi ma proprio nessuno risponde, lo so che sarebbe formativo riuscirci da solo ma non ci riesco ed è circa 10 ore che ci provo.
Dai un'occhiata a questo codice inserito nel main e parti da questo per trasformarlo in *una sola* funzione (non primo e prossimo ma una sola funzione di lettura)
codice:case 7: FILE *fp; struct cliente *ptmp; fp=fopen("listaclienti.txt","r"); i=1; while(!feof(fp)) { ptmp = (cliente *)malloc(sizeof(struct cliente)); ptmp->next = NULL; fscanf(fp,"%d %s %s",&ptmp->codice,ptmp->nome,ptmp->cognome); if(i==1) p = ptmp; else { struct cliente *t = p; while(t->next!=NULL) t=t->next; t->next = ptmp; } i++; } fclose(fp); break;
No MP tecnici (non rispondo nemmeno!), usa il forum.
grazie oregon ora il problema è che quando visualizzo la lista mi riporta dei numeri strani.
nel case 7 ho allocato la memoria a p e glielo passo alla funzione con il codice sopra.
Cioè ? Cosa hai scritto ?
La memoria viene allocata dal codice che ti ho mostrato, non devi allocarne altra ...
No MP tecnici (non rispondo nemmeno!), usa il forum.
ho scritto questo , ho pensato che dovevo passare p no?codice:case 7: p = (struct cliente*)malloc(sizeof(struct cliente)); leggilista(p); ... void leggilista(struct cliente *p) { FILE *fp; struct cliente *ptmp; fp=fopen("listaclienti.txt","a+"); i=1; while(!feof(fp)) { ptmp =(struct cliente*)malloc(sizeof(struct cliente)); ptmp->next = NULL; fscanf(fp,"%d %s %s",&ptmp->codice,ptmp->nome,ptmp->cognome); if(i==1) p = ptmp; else p->next = ptmp; i++; } fclose(fp); }
Allora
1) io avevo modificato il codice e aggiunto una parte ... tu hai usato la prima versione ... usa il codice con le modifiche ...
2) non devi allocare nulla quando chiami la funzione
3) la funzione deve accettare un doppio puntatore alla struttura, ovvero
void leggilista(struct cliente **pp)
ed essendo void non restituisce nulla. Quindi devi chiamarla con
p = NULL;
leggilista(&p);
Ovviamente dovrai modificare il codice della funzione in modo che utilizzi il doppio puntatore pp al posto del singolo puntatore p
E alla fine funzionerà
No MP tecnici (non rispondo nemmeno!), usa il forum.
ecco il problema non ho studiato il doppio puntatore **pp non l'ho mai visto e il prof non lo ha mai spiegato, c'è un modo per farlo senza? se no sono rovinato.
Beh ... allora rifacciamo tutto ... questa è la funzione
e la chiami semplicemente concodice:struct cliente* leggilista() { FILE *fp; struct cliente *p=NULL, *pcur, *ptmp; fp=fopen("listaclienti.txt", "r"); i=1; while(!feof(fp)) { ptmp =(struct cliente*)malloc(sizeof(struct cliente)); ptmp->next = NULL; fscanf(fp,"%d %s %s",&ptmp->codice,ptmp->nome,ptmp->cognome); if(i==1) { p = ptmp; pcur = p; } else { pcur->next = ptmp; pcur = pcur->next; } i++; } fclose(fp); return p; }
p = leggilista();
No MP tecnici (non rispondo nemmeno!), usa il forum.
ti ringrazio infinitamente, mi hai dimostrato che devo imparare ancora moltissimo e soprattutto devo prendere molta piu' confidenza con i puntatori e di conseguenza le liste dinamiche.
Sei stato di grande aiuto.Grazie Grazie Grazie