Fin de Fichier en C++
J'ai un n X 2 matrice stockée dans un fichier texte comme il est. J'essaie de le lire en C++
nb_try=0;
fin>>c_tmp>>gamma_tmp;
while (!fin.eof( )) //if not at end of file, continue reading numbers
{
//store
cs_bit.push_back(c_tmp);
gammas_bit.push_back(gamma_tmp);
nb_try++;
//read
fin>>c_tmp;
assert(!fin.fail( )); //fail at the nb_try=n
if(fin.eof( ))break;
fin>>gamma_tmp; //get first number from the file (priming the input statement)
assert(!fin.fail( ));
}
La première assertion se trompe jamais, c'est à dire fin.fail( ) est vrai, quand nb_try==n, ce qui arrive quand on essaie de lire le premier numéro qui n'existe pas. Mais comment se fait-fin.eof( ) n'est pas vrai, après la lecture du dernier numéro? Signifie qu'il devient vrai que lors de la lecture du premier numéro, qui n'est ot existent? Aussi est-il vrai que la fin.fail( ) et de fin.eof( ) sont de plus vrai en même temps?
Merci et salutations!
OriginalL'auteur Tim | 2009-09-29
Vous devez vous connecter pour publier un commentaire.
C'est la mauvaise façon de lire un fichier:
Le modèle standard est:
Donc en regardant votre code rapidement, je pense qu'il serait asier à écrire comme:
Le problème est que les expressions du FOLKLORE n'est vrai que APRÈS vous essayez de lire au-delà. N'ayant aucun caractère vers la gauche dans le fichier à lire n'est pas la même que EOF être vrai. Si vous lisez la dernière ligne et obtenir des valeurs et il n'y a rien à lire, mais EOF est encore faux, de sorte que le code re-entrer dans la boucle. Lorsqu'il tente et de lire les c_tmp puis EOF est déclenchée et votre affirme aller en forme de poire.
La solution est de mettre le lire comme la condition du while. La suite de la lecture du flux. Mais lorsqu'un flux est utilisé dans un contexte booléen (comme une condition du while), il est converti en un type qui peut être utilisé comme un bool (Techniquement, c'est un void*, mais c'est pas important).
EOF est vrai lorsque vous essayez de lire passé EOF. La lecture jusqu'à la fin du fichier ne change pas l'état. Donc EOF devient vrai lorsque vous lisez la première valeur qui n'existe pas après la fin du fichier.
Merci encore! cette clarifier les expressions du FOLKLORE. Pour ifstream::fail(), cela devient vrai lors de la première lecture-delà de la fin du fichier comme eof ()? Dans mon exemple, cela semble être vrai. Mais j'ai appris à partir de cplusplus.com/reference/iostream/ios/fail que "La fonction renvoie la valeur true si le failbit n', ou le badbit est réglé. Au moins l'un de ces indicateurs est défini lors de certaines erreurs autres que d'atteindre la Fin De Fichier se produit lors d'une opération d'entrée". Faut-il dire fail() ne devient pas vrai seulement parce que les expressions du FOLKLORE se produit?
ifstream::fail() n'implique pas des expressions du folklore, voir ici pour une explication des indicateurs de l'état: cplusplus.com/reference/iostream/ios_base/iostate
L'échec de bit est défini si la dernière opération a échoué. Dans ce cas, l'échec et des expressions du folklore deviendront de vrais en même temps. Mais cela ne signifie pas que l'échec et les expressions du folklore sont la même chose. Remarque l'échec sera réglé que si vous essayez de lire un non numérique chaîne de caractères dans une variable int avec l'opérateur >> etc. À ce stade, l'échec de bits est vrai, mais les expressions du folklore est encore faux.
OriginalL'auteur Martin York
IIRC, le eofbit ne pas se fixer jusqu'à ce que vous en fait essayez de lire au-delà de la fin du fichier. C'est, une fois que vous avez atteint la fin du fichier, vous devez lire une fois de plus avant que le drapeau est réglé.
OriginalL'auteur bambams
Si le fichier texte contient cette séquence, sans les guillemets, "12345 67890", puis le #3 sera de retour faux, mais #4 sera de retour vrai, car il n'y a pas d'espace après le dernier numéro:
Toutefois, si la séquence est "12345 6789" (notez l'espace après le dernier numéro), puis le #3 et #4 sera à la fois de retour faux, mais #5 et #6 retournera true.
Vous devriez vérifier pour les deux, eof() et fail() et si deux conditions sont remplies, vous n'avez plus de données. Si fail() est vrai, mais eof() est faux, il y a un problème avec le fichier.
OriginalL'auteur Andre