[C]Problemi con lista concatenata
Premetto che sono alle prime armi però nello scrivere questo programma ho notato una cosa fastidiosa dalla quale non riesco a venirne a capo ..
In sostanza il programma estrae dei record da un file di testo e con questi ci costruisce una lista concatenata . Nello stampare la lista però non capisco perchè mi compare piu volte solo l'ultima riga del file di testo !
ecco il codice in c :
il concenuto di Studenti.txt è
però in console mi stampa :
La lista e'
Qualcuno mi può dare qualche idea su dove sbaglio e perchè ? grazie per i suggerimenti
In sostanza il programma estrae dei record da un file di testo e con questi ci costruisce una lista concatenata . Nello stampare la lista però non capisco perchè mi compare piu volte solo l'ultima riga del file di testo !
ecco il codice in c :
#include <stdio.h> #include <stdlib.h> struct studente { char *nome ; char *cognome; int matr ; int anno_corso ; char *recapito ; char *email ; int password ; struct studente *nextPtr ; }; typedef struct studente Studenti ; typedef Studenti *StudentiPtr ; StudentiPtr start = NULL ; char nome_m[20] ; char cognome_m[20]; int matr_m ; int anno_corso_m ; char recapito_m[40] ; char email_m[20] ; void creazione_s(StudentiPtr *sPtr,char *name,char *surname,char *andress,char *em,int matr) //come era il passaggio dei par? { FILE *stPtr ; if((stPtr = fopen( "Studenti.txt","a") ) == NULL ) { printf("Il file è danneggiato o è impossibile aprirlo") ; } else { fprintf(stPtr,"%d %s %s %s %s \n", matr,name,surname,andress,em); } fclose(stPtr); StudentiPtr newPtr ; StudentiPtr previousPtr ; StudentiPtr currentPtr ; newPtr = malloc( sizeof(Studenti)) ; if( newPtr != NULL) { newPtr->nome = name ; newPtr->cognome = surname ; newPtr->recapito = andress ; newPtr->matr =0 ; newPtr->email = em ; newPtr->nextPtr = NULL ; previousPtr = NULL ; currentPtr = *sPtr ; while(currentPtr !=NULL ) { previousPtr = currentPtr ; currentPtr = currentPtr->nextPtr ; } if(*sPtr == NULL ) { newPtr-> nextPtr = NULL ; *sPtr = newPtr ; } else { previousPtr->nextPtr = newPtr ; newPtr->nextPtr = NULL ; } } } void print_l(StudentiPtr currentPtrr) { if(currentPtrr==NULL) { printf("L'archivio è vuoto") ; } else{ printf("La lista e' \n ") ; while(currentPtrr !=NULL) { printf("%d ",currentPtrr->matr); printf("%s ",currentPtrr->nome); printf("%s ",currentPtrr->cognome); printf("%s ",currentPtrr->recapito); printf("%s \n",currentPtrr->email); printf("%d \n",currentPtrr->nextPtr); currentPtrr = currentPtrr->nextPtr ; } printf("null\n") ; } } void creazione_l() { FILE *stPtr ; if((stPtr = fopen("Studenti.txt","r"))==NULL ) printf ("Il file è danneggiato e non può essere aperto") ; else { fscanf(stPtr, "%d%s%s%s%s", &matr_m,nome_m,cognome_m,recapito_m,email_m) ; while(!feof(stPtr)) { creazione_s(&start,nome_m,cognome_m,recapito_m,email_m,matr_m) ; fscanf(stPtr, "%d%s%s%s%s", &matr_m,nome_m,cognome_m,recapito_m,email_m); } fclose(stPtr) ; print_l(start) ; } } int main(int argc, char *argv[]) { creazione_l() ; system("PAUSE"); return 0; }
il concenuto di Studenti.txt è
0 kkio Ciiiao gggg grr@dsar.it 9 ioiooi jkkp 999 ju90uuoui 8 hiikk jkl ipp ppuu
però in console mi stampa :
La lista e'
0 hiikk jkl ipp ppuu 4007208 0 hiikk jkl ipp ppuu 0 null Premere un tasto per continuare . . .
Qualcuno mi può dare qualche idea su dove sbaglio e perchè ? grazie per i suggerimenti

Risposte
Non ho avuto ancora modo di controllarlo tutto ma perché all'interno di creazione_s apri nuovamente il file per scrivere le cose lette?
Si infatti ho poi scoperto che bastava aprirlo una volta e chiuderlo una volta soltanto . Credevo che le operazioni di scrittura e lettura richiedevano due aperture distinte ma mi sbagliavo .. Comunque grazie per l'interessamento che mostri per noi tutti profani !
