[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 !