J’ai lu une question sur Stack Overflow où eofbit pour le file
istream est défini mais le failbit ne l’est pas. Dans ce cas, le fichier est true et file.eof () est true mais file.good () est false. Par exemple, avec un fichier dont la taille correspond exactement à un octet:
ifstream file("one.txt"); assert( file.is_open() ); for( int i = 0; i < 2; ++i ) { char chars[255] = {0}; file.getline(chars, 2); //file.read( chars, 2 ); cout << "file: " << !!file << endl; cout << "good: " << file.good() << endl; cout << "eof: " << file.eof() << endl; cout << "fail: " << file.fail() << endl; cout << "bad: " << file.bad() << endl; cout << endl; }
C’est la sortie:
file: 1 good: 0 eof: 1 fail: 0 bad: 0 file: 0 good: 0 eof: 1 fail: 1 bad: 0
Si je commente getline () et utilise read () à la place, j’obtiens ceci:
file: 0 good: 0 eof: 1 fail: 1 bad: 0 file: 0 good: 0 eof: 1 fail: 1 bad: 0
Dans les deux cas, je lis au-delà de la fin du fichier lors de la première itération de la boucle. Pourquoi un EOF est-il un échec et un autre ne l’est pas? La réponse dans l’autre fil indique “chaque fois que vous rencontrez la fin d’un fichier sans essayer de lire derrière celui-ci”. lire derrière elle? Qu’est-ce que ça veut dire?
eofbit
est défini par la méthode getline
s’il arrête de lire car il atteint la fin du stream (fichier) plutôt que de rechercher le caractère délimiteur. getline
ce cas, getline
ne getline
pas le failbit
, ce qui est logique car il n’a pas échoué: il lit certaines données.
Une fois que l’ eofbit
est défini, la prochaine opération de lecture sur ce stream définira le failbit
, car la fonction failbit
interne, appelée au début de presque toutes les opérations d’entrée, définira failbit
si eofbit
est défini.
En général, l’ eofbit
“indique qu’une opération d’entrée a atteint la fin d’une séquence d’entrée”, tandis que failbit
“indique qu’une opération d’entrée n’a pas réussi à lire les caractères attendus” (les deux guillemets proviennent de la norme C ++, section [ios.types]
; §27.5.3.1, tableau 124, dans le dernier projet que je getline
.) Comme le getline
exemple de getline
, il est tout à fait possible qu’une opération d’entrée lise la fin d’une séquence d’entrée tout en continuant de lire.
Une autre façon de regarder, un peu moins formelle – et donc peut-être incorrecte – est que eofbit
est défini si l’opération de lecture a atteint la fin du fichier, alors que le failbit
la failbit
est défini si l’opération de lecture n’a pas pu lire le nombre minimal de fichiers. caractères nécessaires. Les 2
dans les appels à getline
et read
signifient des choses différentes; dans getline
, il s’agit du nombre maximal de caractères pour l’opération d’entrée (le nombre minimal est 1); dans le cas de read
, c’est le nombre précis de caractères.