lecture jusqu’à la fin du fichier en C ++

J’essaie de lire jusqu’à la fin d’un fichier pour une application de répertoire qui convertit du C au C ++. Lorsque j’imprime les résultats du fichier, je reçois ceci:

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

il devrait imprimer:

 johnny smith (Home)3 (Cell)4 

En ce moment, j’utilise while(!infile.eof()) que j’ai lu est une mauvaise pratique, mais lorsque j’utilise infile.getline() , le nom et le prénom sont répétés, et le format est tout. levé. Y a-t-il un moyen (ou un autre moyen) de se débarrasser de la malbouffe à la fin de l’entrée ou d’un autre moyen de lire jusqu’à la fin du fichier en C ++ qui résout ce problème? J’ai lu différentes solutions, mais celle sur laquelle de nombreux sites semblent s’accorder est fgets , ce que j’avais avec la version C d’origine, mais il est évident que fgets ne fonctionne pas avec ifstream ce que j’utilise. . voici le code:

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

N’utilisez pas eof() pour déterminer si vous avez atteint la fin du fichier. Lisez plutôt ce que vous voulez lire, puis vérifiez si vous avez bien lu les données. La lecture d’object a échoué, vous pouvez utiliser eof() pour déterminer si l’erreur est due à la fin du fichier avant la production d’un rapport d’erreur sur une erreur de format.

Puisque vous avez mentionné que vous avez lu qu’utiliser !infile.eof() est une bonne pratique: pouvez-vous nous indiquer la source de cette information erronée? Cette information nécessite une correction.

  1. N’utilisez pas !eof() . Il vérifie si le dernier échec de lecture est dû à la fin du fichier. Cela ne prédit pas l’avenir.

  2. N’utilisez pas malloc en C ++. Si vous le faites, vérifiez la valeur de retour pour les erreurs!

  3. N’utilisez pas l’ operator>> pour char * . Il n’y a pas de vérification de taille, donc c’est juste demander des débordements de mémoire tampon.

  4. Le contrôle '\n' sur le tampon est inutile. operator>> pour les chaînes s’arrête au blanc.

  5. Vous écrivez aveuglément une chaîne de longueur inconnue dans temp.home de taille 20. C’est un autre débordement de mémoire tampon.

  6. … J’ai en quelque sorte arrêté de lire là-bas. Si vous voulez lire des éléments d’un fichier mais vous arrêter sur eof / error, vous pouvez faire quelque chose comme ceci:

.

 ssortingng a, b, c; while (true) { if (!(in >> a)) break; if (!(in >> b)) break; if (!(in >> c)) break; do_stuff_with(a, b, c); }