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:
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;
}
non ci sono errori di compilazione però si comporta in modo anomalo perchè:
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...