can't copy/read in right mode from a file to a list
===

i've a problem with read/write from file and view correctly the input:

    // LOAD THE LIST FROM THE FILE
    struct elemento *caricalista(struct elemento *p){
     struct elemento *punt;
    FILE * utenti = fopen ("miarubrica.txt","r");
  
    char nome[MAX];
    char cognome[MAX];
    char telefono[MAX];
    char mail[MAX];
  
 
  
    if(utenti==NULL) {printf("non ho caricato gli utenti");}
    else {
      while(!feof(utenti)) {	


	if (p != NULL) {
	punt = (struct elemento *)malloc(sizeof(struct elemento));

	fscanf(utenti,"%s",nome);
	puts(nome);
	fscanf(utenti,"%s",cognome);
	puts(cognome);
	fscanf(utenti,"%s",telefono);
	puts(telefono);
	fscanf(utenti,"%s",mail);
	puts(mail);


	strcpy(punt->nome,nome);
	strcpy(punt->cognome,cognome);
	strcpy(punt->telefono,telefono);
	strcpy(punt->mail,mail);

	punt->pun = p;

	
	
  
    } else if (p == NULL) {
     p = (struct elemento *)malloc(sizeof(struct elemento));
	fscanf(utenti,"%s",nome);
	fscanf(utenti,"%s",cognome);
	fscanf(utenti,"%s",telefono);
	fscanf(utenti,"%s",mail);
    
	strcpy(p->nome,nome);
	strcpy(p->cognome,cognome);
	strcpy(p->telefono,telefono);
	strcpy(p->mail,mail);
	
	
	p->pun = NULL;
	punt=p;
    
      }


    }
     }
    fflush(utenti);
    fclose(utenti);
     return(punt);
    }







    // SAVE THE LIST 
     int salva(struct elemento *p) { 

    FILE *stream = fopen("miarubrica.txt","w");

    while (p != NULL)
    { 

    // Scrive sul file
    fprintf(stream, "%s ", p->nome);
	fprintf(stream, "%s ", p->cognome);
	    fprintf(stream, "%s ", p->mail);
		fprintf(stream, "%s \n", p->telefono);

    p = p->pun;

    } 
 
    fflush(stream);
    fclose(stream);

    return;
    }


this write me (example)    pippo disney 02345432 pippodisney@pippodisney.com   in miarubrica.txt but when i read it with a method that read lists (it works), i see 

    pippo disney 02345432 pippodisney@pippodisney.com
    pippo disney 02345432 pippodisney@pippodisney.com

two times in the shell.  what's wrong?