[C]Problemi con lista concatenata

BuioTotaleinside
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 :

#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 :lol:

Risposte
apatriarca
Non ho avuto ancora modo di controllarlo tutto ma perché all'interno di creazione_s apri nuovamente il file per scrivere le cose lette?

BuioTotaleinside
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 ! :D

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.