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?
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.
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.
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.
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();
}
}