Si courant continu au-delà de la fin ne renvoie pas eof dans VS 2008 Express

Dans VS 2005, j’ai un code qui ressemble à ceci:

ifs.open("foo"); while (!ifs.eof()) { ifs.read(&bar,sizeof(bar)); loc = ifs.tellg(); loc += bar.dwHeaderSize; // four byte boundary padding if ((loc % 4) != 0) loc += 4 - (loc % 4); ifs.seekg(loc,ios::beg); } ifs.close(); 

Le code fonctionnait bien dans VS 2005, mais échouait dans VS 2008 Express. D’après ce que je peux dire, VS 2008 ne renvoie pas eof () après la recherche du code à la fin du fichier. Est-ce que je manque quelque chose? Je l’ai corrigé en ajoutant une vérification explicite pour voir si l’emplacement de recherche dépassait la taille du fichier, mais je veux m’assurer de bien comprendre le courant si correctement

L’indicateur EOF n’est déclenché qu’après une tentative de lecture au-delà de la fin du fichier.
La lecture upto la fin du fichier ne le déclenchera pas.

C’est pourquoi la plupart du code ressemble à ceci:

 while(ifs.read(&bar,sizeof(bar))) { // Do Stuff } 

Si le résultat de read () va jusqu’à l’EOF, la boucle sera entrée.
Si le résultat de read () dépasse EOF, la boucle ne sera PAS complétée.

  • NOTE: read () ne dépassera le EOF que s’il rest zéro octet dans le fichier. Sinon, il sera lu jusqu’à la fin du fichier. Donc, la boucle est toujours entrée s’il rest quelque chose dans le fichier.

La raison est le résultat de la lecture (la valeur de retour) est une référence au stream. Si le stream est utilisé dans un contexte booléen (tel que l’expression if test), il est converti en un type pouvant être utilisé dans un tel contexte. Le résultat de cette conversion teste l’indicateur EOF (en plus de quelques autres) et renvoie le quivalent de false si EOF est vrai.

Remarque:
Cette technique fonctionne mieux si vous surchargez l’opérateur << pour votre classe Bar car cela devrait indiquer exactement ce dont il a besoin pour l'objet sans dépasser l'EOF. Il est alors plus facile de faire en sorte que vos objets lisent exactement jusqu’à la fin du fichier sans passer par dessus. Ce qui me préoccupe avec read, c'est ce qui devrait se passer si read () veut 10 octets et qu'il n'y a que 5 octets dans le fichier, que se passe-t-il avec l'objet partiellement rempli?

Si vous souhaitez continuer à utiliser votre style, le code devrait ressembler à ceci:

 ifs.open("foo"); while (!ifs.eof()) { ifs.read(&bar,sizeof(bar)); if (ifs.eof()) { break; } // Do Stuff }