Visualizzazione dei risultati da 1 a 2 su 2
  1. #1

    [C]Correzione procedura

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

  2. #2
    nessuno può aiutarmi???

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.