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?
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:
- std :: basic_ios :: operator void * () documentation sur le site de référence,
- L'article L'idiome Safe Bool sur artima ,
- FAQ C ++ lite & # 167; 15.4 ,
- la norme, ...
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.