leyendo hasta el final del archivo en C ++

Estoy tratando de leer hasta el final de un archivo para una aplicación de directorio telefónico que estoy convirtiendo de C a C ++. Cuando imprimo los resultados del archivo obtengo esto:

johnny smith
(Home)3
(Cell)4
x☺> x☺>
(Home)4
(Cell)4

se debe imprimir:

johnny smith
(Home)3
(Cell)4

Ahora mismo estoy usandowhile(!infile.eof()) Lo que he leído es una mala práctica, pero cuando usoinfile.getline() Recibo una repetición del nombre y apellido, y el formato es todo elevado. ¿Hay alguna forma (u otra forma) de deshacerse de la basura al final de la entrada u otra forma de leer hasta el final del archivo en C ++ que corrige esto? He estado leyendo sobre diferentes soluciones, pero en la que muchos sitios parecen estar de acuerdo esfgets, que es lo que tuve con la versión original en C, pero obviamentefgets no funciona conifstream que es lo que estoy usando. Aquí está el código:

void contacts:: readfile(contacts*friends ,int* counter, int i,char buffer[],char    user_entry3[])
{
   ifstream read;
   read.open(user_entry3,ios::in);
   int len;
   contacts temp;
   *counter=0;
   i=0; 

     while (!read.eof()) { 
       temp.First_Name=(char*)malloc(36); 
       temp.Last_Name=(char*)malloc(36); 

       read>>temp.First_Name>>temp.Last_Name;

       read>>buffer;
       len=strlen(buffer);
       if(buffer[len-1]=='\n')
          buffer[len-1]='\0';

       temp.home=(char*)malloc(20); 
       strcpy(temp.home, buffer);

       read>>buffer;
       len=strlen(buffer);
       if(buffer[len-1]=='\n')
       buffer[len-1]='\0';


       temp.cell=(char*)malloc(20); 
       strcpy(temp.cell, buffer); 

      friends[i].First_Name=(char*)malloc(MAXNAME);
      friends[i].Last_Name=(char*)malloc(MAXNAME);
      friends[i].home=(char*)malloc(MAXPHONE);
      friends[i].cell=(char*)malloc(MAXPHONE);


  //adds file content to the structure
      strcpy(friends[*counter].First_Name,temp.First_Name);
      strcpy(friends[*counter].Last_Name,temp.Last_Name);
      strcpy(friends[*counter].home,temp.home);
      strcpy(friends[*counter].cell,temp.cell);


     (*counter)++;
     i++; 

   }
   //closes file and frees memory
    read.close();
    free(temp.Last_Name);
    free(temp.First_Name);
    free(temp.home);
    free(temp.cell);
}

Respuestas a la pregunta(2)

Su respuesta a la pregunta