web-dev-qa-db-fra.com

Utiliser getline () en C ++

J'ai un problème avec la méthode getline pour recevoir un message que l'utilisateur tape, j'utilise quelque chose comme:

string messageVar;
cout << "Type your message: ";
getline(cin, messageVar);

Cependant, cela ne s'arrête pas pour obtenir la valeur de sortie, qu'est-ce qui ne va pas avec cela?

45
MGE

Si vous utilisez getline() après cin >> something, vous devez vider le caractère de nouvelle ligne de la mémoire tampon entre les deux. Vous pouvez le faire en utilisant cin.ignore().

Ce serait quelque chose comme ça:

string messageVar;
cout << "Type your message: ";
cin.ignore(); 
getline(cin, messageVar);

Cela est dû au fait que l'opérateur >> laisse un caractère de nouvelle ligne \n dans le tampon d'entrée. Cela peut devenir un problème lorsque vous effectuez une entrée non formatée, comme getline(), qui lit l'entrée jusqu'à ce qu'un caractère de nouvelle ligne soit trouvé. Cela se produisant, la lecture s'arrêtera immédiatement, à cause de ce \n laissé en suspens lors de votre précédente opération.

86
Natan Streppel

Si vous n'avez qu'une seule nouvelle ligne dans l'entrée, faites simplement

std::cin.ignore();

fonctionnera bien. Il lit et supprime le caractère suivant de l'entrée.

Mais si vous avez encore quelque chose dans l'entrée, à part la nouvelle ligne (par exemple, vous lisez un mot mais l'utilisateur a entré deux mots), alors vous devez faire

std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

Voir par exemple cette référence de la fonction ignore .

Pour être encore plus sûr, exécutez la seconde alternative ci-dessus dans une boucle jusqu'à ce que gcount renvoie zéro.

5

J'ai eu des problèmes similaires. Le seul inconvénient est qu'avec cin.ignore (), vous devez appuyer sur Entrée une fois de plus, ce qui perturbe le programme.

2
logankilpatrick
int main(){
.... example with file
     //input is a file
    if(input.is_open()){
        cin.ignore(1,'\n'); //it ignores everything after new line
        cin.getline(buffer,255); // save it in buffer
        input<<buffer; //save it in input(it's a file)
        input.close();
    }
}
2
Antonija