czytanie do końca pliku w C ++

Próbuję odczytać do końca plik dla aplikacji książki telefonicznej, która jest konwertowana z C do C ++. Kiedy drukuję wyniki z pliku, otrzymuję to:

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

powinien wydrukować:

johnny smith
(Home)3
(Cell)4

Teraz używamwhile(!infile.eof()) co przeczytałem jest kiepską praktyką, ale kiedy używaminfile.getline() Otrzymuję powtórzenie imienia i nazwiska, a format jest podciągnięty. Czy mimo to (lub w inny sposób) pozbędziesz się śmieci na końcu wejścia lub inny sposób czytania do końca pliku w C ++, który to naprawi. Czytałem o różnych rozwiązaniach, ale wiele z nich wydaje się zgadzaćfgets, co miałem z oryginalną wersją C, ale oczywiściefgets nie działa zifstream z czego korzystam. oto kod:

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);
}

questionAnswers(2)

yourAnswerToTheQuestion