Question

J'ai une boucle qui lit chaque ligne d'un fichier en utilisant getline () :

istream is;
string line;
while (!getline(is, line).eof())
{
    // ...
}

J'ai remarqué que l'appel de getline () comme ceci semble également fonctionner:

while (getline(is, line))

Qu'est-ce qui se passe ici? getline () renvoie une référence de flux. Est-il converti en un pointeur d'une manière ou d'une autre? Est-ce vraiment une bonne pratique ou devrais-je m'en tenir à la première forme?

Était-ce utile?

La solution

Le istream renvoyé par getline () reçoit la méthode de l'opérateur void * () appelée de manière implicite, qui indique si le flux a été exécuté dans une erreur. En tant que tel, il effectue plus de contrôles qu'un appel à eof () .

Autres conseils

Mise à jour:

J'avais signalé à tort le documentation basic_istream pour la méthode operator bool () sur la classe basic_istream :: sentry, mais comme cela a été souligné, ce n’est pas ce qui se passe réellement. J'ai voté les bonnes réponses de Charles et Luc. Il s’agit en fait de l’opérateur void * () appelé. En savoir plus sur cette dans la FAQ C ++ .

Charles a bien donné la réponse correcte .

Ce qui est appelé est en effet std :: basic_ios :: operator void * () , et non sentry :: operator bool () , ce qui est cohérent avec le fait que std :: getline () retourne un std :: basic_istream (donc un std :: basic_ios ), et non une sentinelle. / p>

Pour les non-croyants, voir:

Sinon, comme d'autres l'ont déjà dit, préférez la deuxième forme qui est canonique. N'utilisez pas fail () si vous voulez réellement un code détaillé - je ne me souviens jamais si xxx.good () peut être utilisé à la place de ! Xxx.fail ( )

Je resterais avec le premier formulaire. Bien que la deuxième forme puisse fonctionner, elle n’est guère explicite. Votre code d'origine décrit clairement ce qui est fait et comment on s'attend à ce qu'il se comporte.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top