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...