Ciao, ho scritto una procedura che inserisce record in un file mantenendo il file ordinato secondo il campo username, tutto questo viene realizzato nel seguente modo:
-acquisisco tutti i campi del record
-se si tratta del primo record del file lo scrivo direttamente sul file,altrimenti controllo se nel file esiste un altro record con lo stesso username in questo caso visualizzo un msg d'errore
-se nn c'è un altro record con lo stesso username creo un file temporaneo e confronto gli username dei record presenti nel file con quello acquisito:se il confronto risulta <0 scrivo sul file temporaneo il record letto dal file,la prima volta che il confronto risulta >0 scrivo sul file temporaneo prima il record acquisito,poi quello letto e poi copio tutti gli altri record
-infine cancello il file iniziale e rinomino il file temporaneo come quello iniziale
questo è il codice:
non ci sono errori di compilazione però si comporta in modo anomalo perchè:codice:int insutente(int cu){ struct recuser z; struct recuser w; int e=0; int p=0; FILE * f; FILE * f1; int i; acquisisco tutti i campi del record printf("\n Indica l'USERNAME dell'utente (massimo 15 caratteri) da inserire "); printf("\n N.B. In caso di piu' parole al posto degli spazi utilizzare \n"); printf(" il carattere di UNDERSCORE \n "); scanf("%s",z.username); printf("\n Indica il nome dell'utente da inserire \n "); scanf("%s",z.nome); printf("\n Indica il cognome dell'utente da inserire \n "); scanf("%s",z.cognome); printf("\n Indica l'e-mail dell'utente da inserire \n"); scanf("%s",z.email); printf("\n TIPOLOGIE DI NEWS TRA CUI SCEGLIERE: \n "); /* chiamo la procedura vistipologie che visualizza le tipologie di news tra cui scegliere */ vistipologie(); /* acquisisco il codice della prima tipologia di news a cui è interessato l'utente */ printf("\n Inserire il codice della prima tipologia di news a cui e' interessato l'utente :\n "); scanf("%d",&z.codtiponews1); /* acquisisco il codice della seconda tipologia di news a cui è interessato l'utente */ printf("\n Inserire il codice della seconda tipologia di news a cui e' interessato l'utente :\n "); scanf("%d",&z.codtiponews2); /* acquisisco il codice della terza tipologia di news a cui è interessato l'utente */ printf("\n Inserire il codice della terza tipologia di news a cui e' interessato l'utente :\n "); scanf("%d",&z.codtiponews3); cu è il contatore che indica quanti elementi sono stati inseriti if( cu==0 ){ f=fopen("utenti.dat","ab"); fwrite(&z,sizeof(struct recuser),1,f); fclose(f); cu++; } else{ controllo se l'username esiste già f=fopen("utenti.dat","rb"); while( feof(f)==0 && e==0 ){ fread(&w,sizeof(struct recuser),1,f); if( (strcmp(w.username,z.username)==0) ){ e=1; } } fclose(f); if( e==0 ){ f1=fopen("temputenti.dat","wb"); f=fopen("utenti.dat","rb"); while( feof(f)==0 ){ fread(&w,sizeof(struct recuser),1,f); if( p==1 ){ fwrite(&w,sizeof(struct recuser),1,f1); } else{ if( (strcmp(w.username,z.username)>0) ){ p=1; fwrite(&z,sizeof(struct recuser),1,f1); fwrite(&w,sizeof(struct recuser),1,f1); } else{ fwrite(&w,sizeof(struct recuser),1,f1); } } } cu++; fclose(f1); fclose(f); remove("C:\\programmic\\progetto\\utenti.dat"); rename("C:\\programmic\\progetto\\temputenti.dat","C:\\programmic\\progetto\\utenti.dat"); } else{ printf(" L'USERNAME scelto esiste gia' sceglierne un'altro e riprovare "); } } return cu; }
ho provato a scrivere un main in cui chiamavo tre volte questa procedura e poi chiamavo una procedura che visualizza tutti i record del file
e ottengo come risultato tre volte l'output dello stesso record come se avesse scritto sempre lo stesso record
per favore aiutatemi è molto importante...

Rispondi quotando
