2010-08-21 4 views
2

Voici le code:Problème obtenir les commentaires de l'utilisateur

cout << "Please enter the file path: "; 
string sPath; 
getline(cin, sPath); 
cout << "Please enter the password: "; 
string sPassword; getline(cin, sPassword); 

Le problème est, quand je le lance il affiche « S'il vous plaît entrer le chemin du fichier: » il affiche « S'il vous plaît entrer le mot de passe: » et attend ensuite le mot de passe. Il semble complètement ignorer le premier 'getline()'.

modifier plus tard: Oui, il y a des opérations d'entrée effectuées avant.

int iOption = 0; 
while (iOption == 0) 
{ 
    cout << "(E/D): "; 
    switch (GetCH()) 
    { 
    case 'E': 
     iOption = 1; 
     break; 
    case 'e': 
     iOption = 1; 
     break; 
    case 'D': 
     iOption = 2; 
     break; 
    case 'd': 
     iOption = 3; 
     break; 
    default: 
     break; 
    } 
} 

Et le code pour GetCH() au cas où quelqu'un le demanderait.

char GetCH() 
{ 
    char c; 
    cin >> c; 
    return c; 
}; 
+2

Est-ce le code complet? Avez-vous effectué des opérations d'entrée avant que ce code ne s'exécute? –

Répondre

0

Il semble que le reste de la ligne qui était entrée pour GetCH reste dans la mémoire tampon au moment où vous appelez getline , c'est-à-dire au moins un \n et c'est ce que vous lisez dans le premier appel getline. Le programme ne bloque pas l'attente de l'entrée de l'utilisateur car la demande getline peut être satisfaite par la ligne partielle encore en attente de lecture.

modifier votre fonction Tenir compte GetCH lire des lignes entières ainsi.

E.g. quelque chose comme (totalement non testé, j'ai peur):

int GetCH() 
{ 
    std::string inputline; 

    // Read until error or we receive a non-empty line 
    while(std::getline(std::cin, inputline) && inputline.empty()) 
    { 
    } 

    return inputline.empty() ? EOF : inputline[0]; 
} 
0

Vous devez effacer tout ce qui est disponible dans le flux d'entrée comme ci-dessous

cin.clear(); 

cin.ignore(std::numeric_limits<std::streamsize>::max()) 
+0

La deuxième ligne ne semble pas fonctionner. Cela me donne 2 erreurs (j'ai ajouté le semicolumn). – Andrew

0

J'ai un cin.clear() avant que la boucle while et ont modifié l'option Getch pour obtenir une chaîne entière avec « getline » et seulement retourner la première lettre.

char GetCH() 
{ 
    string c; 
    getline(cin, c); 
    return c[0]; 
}; 

Cela fonctionne comme un charme maintenant. Merci à tous pour votre aide.

+0

Bien qu'il soit parfaitement correct de répondre à votre propre question, si vous dupliquez essentiellement d'autres réponses, il est plus logique de récompenser l'une des autres réponses par une «acceptation» plutôt que de la dupliquer dans une autre réponse. Je ne mendie pas pour l'acceptation (j'ai assez d'acceptations ailleurs!); juste en observant que vous pourriez vouloir quelques conseils sur la façon dont stackoverflow.com fonctionne. –

Questions connexes