Dupliquer possible:
Besoin d'aide avec getline ()
getline()
ne fonctionne pas, si je l’utilise après quelques entrées, c’est-à-dire
#include<iostream>
using namespace std;
main()
{
string date,time;
char journal[23];
cout<<"Date:\t";
cin>>date;
cout<<"Time:\t";
cin>>time;
cout<<"Journal Entry:\t";
cin.getline(journal,23);
cout<<endl;
system("pause");
}
où, comme si j’utilisais getline()
en plus des entrées, cela fonctionne i.e.
cout<<"Journal Entry:\t";
cin.getline(journal,23);
cout<<"Date:\t";
cin>>date;
cout<<"Time:\t";
cin>>time;
Quelle pourrait être la raison?
Les caractères sont extraits jusqu'à ce que (n - 1) caractères aient été extrait ou le caractère de délimitation est trouvé (qui est delim si ce paramètre est spécifié, ou '\ n' sinon). L'extraction s'arrête également si la fin du fichier est atteinte dans la séquence d'entrée ou si une erreur survient se produit pendant l'opération d'entrée.
Lorsque cin.getline()
lit à partir de l'entrée, il reste un caractère de nouvelle ligne dans le flux d'entrée afin qu'il ne lise pas votre chaîne de caractères. Utilisez cin.ignore()
avant d’appeler getline()
.
cout<<"Journal Entry:\t";
cin.ignore();
cin.getline(journal,23);
Ajoutant à ce que @DavidHammen a dit:
Les opérations d’extraction laissent le dernier caractère '\n'
dans le flux. Par contre, istream::getline()
le jette. Ainsi, lorsque vous appelez getline
après un opérateur d’extraction, '\n'
est le premier caractère qu’il rencontre et la lecture s’arrête là.
Mettez ceci après avant getline
extraction d’appel:
cin.ignore()
Une façon plus robuste de prendre des entrées serait quelque chose comme ceci:
while (true) {
cout<<"Time:\t";
if (cin>>time) {
cin.ignore(); // discard the trailing '\n'
break;
} else {
// ignore everything or to the first '\n', whichever comes first
cin.ignore(numeric_limits<streamsize>::max(), '\n');
cin.clear(); // clear the error flags
cout << "Invalid input, try again.\n";
}
}
Vous ne vérifiez pas l'état du flux. L'opérateur d'extraction de flux std::cin
(operator>>
) peut échouer. Dans ce cas, le flux est marqué comme "mauvais" (failbit
, badbit
ou eofbit
sont définis). Une fois "mauvais", toutes les extractions de flux ultérieures sur ce flux échoueront à moins que vous n'effaciez le statut.
Apprenez à être un programmeur paranoïaque. Toujours vérifier l'état de ces opérations d'entrée formatées. Vous pouvez, par exemple, lever une exception ou imprimer un message d'erreur et quitter. La première chose à faire est de simplement supposer que cela a fonctionné.