web-dev-qa-db-fra.com

getline () ne fonctionne pas s'il est utilisé après quelques entrées

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);
29
P.P.

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";
    }
}
6
jrok

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é.

2
David Hammen