Question

Qu'est-ce que le retour de la méthode istream::getline?

Je demande parce que je l'ai vu que la boucle à travers un fichier, il doit être fait comme ceci:

while ( file.getline( char*, int ) )
{
    // handle input
}

Ce qui est de retour?

Était-ce utile?

La solution

Il retourne un flux afin que nous puissions enchaîner l'opération.

Mais lorsque vous utilisez un objet dans un contexte booléen les regards du compilateur pour un opérateur de conversion qui peut le convertir en un type qui peut être utilisé dans le contexte booléen.

C ++ 11

Dans ce courant de cas a explicit operator bool() const . Quand appelé vérifie les drapeaux d'erreur. Si l'une ou failbit badbit sont cochés alors elle retourne false sinon il retourne vrai.

C ++ 03

Dans ce courant de cas a operator void*() const . Comme cela se traduit par un pointeur, il peut être utilisé dans un contexte booléen. Quand appelé vérifie les drapeaux d'erreur. Si l'failbit ou badbit sont fixés alors il retourne NULL ce qui équivaut à FALSE sinon il renvoie un pointeur vers soi (ou quelque chose d'autre valide si vous ne devriez pas utiliser ce fait)).

Utilisation

Vous pouvez donc utiliser un flux dans un contexte qui nécessiterait un test booléen:

if (stream >> x)
{    
}

while(stream)
{
    /* do Stuff */
}

Note: Il est mauvaise idée de tester le flux à l'extérieur, puis lecture / écriture à l'intérieur du corps de l'instruction conditionnelle / boucle. En effet, l'acte de lecture peut faire le mauvais flux. Il est généralement préférable de faire la lecture dans le cadre du test.

while(std::getline(steam, line))
{
    // The read worked and line is valid.
}

Autres conseils

de référence. Le retour de istream getline est converti en bool par conversion implicite pour vérifier le succès de opération. Cette conversion fait usage de if(mystream.getline(a,b)) en raccourci pour if(!mystream.getline(a,b).fail()).

La fonction renvoie une référence à l'objet de flux lui-même, qui peut être utilisé soit pour la chaîne en outre les opérations de lecture:

myStream.getline(...).getline(...);

ou parce que les flux sont implicitement convertibles en void *s, dans une boucle ou d'état:

while (myStream.getline(...)) {
    ...
}

Vous pouvez en savoir plus à ce sujet sur le site de cplusplus.com:

http://cplusplus.com/reference/iostream/istream/getline/

Il retourne le flux lui-même. Le courant peut convertir (par void*) à bool indiquant son état. Dans cet exemple, votre boucle de while prendra fin quand va « false » conversion à bool du flux, ce qui se produit lorsque votre flux entre dans un état d'erreur. Dans votre code, il est le plus susceptible de se produire quand il y avait une tentative de lecture au-delà de la fin du fichier. Bref, ça va lire autant qu'il est, puis arrêter.

Tout le monde vous a dit ce qu'il est, laissez-moi vous dire, utilisez la forme libre Version

std::string line; 
while(getline(file, line)) // assuming file is an instance of istream
{
//
}

Pourquoi cette version? Il devrait être immédiatement évident - vous passez dans un std::string plutôt que d'une mémoire tampon de caractères de taille fixe

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