2016-10-25 4 views
0

Ich schreibe zur Zeit ein Programm, das von einem Stück Text, wenn das Stück Text dann folgte eine Option ausnehmen muss. Wenn der Text wahr ist, wird ein Stück Code ausgeführt? Zumindest glaube ich das ist, wie es funktioniert, aber so geht das Programm direkt zum anderen und hält aufgrund der Ausgangszustand Looping es nicht die eine weitere Eingabe von dem Benutzer, die getline() ist nicht fragen?Warum schleift das Programm, anstatt nach Eingabe zu fragen?

#include <iostream> 
#include <fstream> 
#include <string> 
#include <iomanip> 

using namespace std; 

int main() { 

    fstream gFile; 
    int choice; 
    string gb; 
    do { 
     cout << "Student Grade Book Info Program....\n"; 
     cout << "\tPlease Select an Option: (1 or 2) \n" << endl 
      << "\t1. Review Grades" 
      << "\n\t2. Quit" 
      << "\n\tChoose: "; 
     cin >> choice; 

     switch (choice) { 

     case 1: 
      cout << "\n\tPlease Enter the Name of the File you wish to View the Grades for: " << endl; 
      cout << "\n\tAvailable Grade Books: gradeBook\n" << 
      "\tType in the Grade Book you would like to view. "; 

      getline(cin, gb); 

      if (gb == "gradeBook") { 

       cout << "execute code..."; 

      } 
      else { 
       cout << "\nError there is no such entry in the system." << endl; 

      } 

     case 2: 
      break; 
     } 

    } while (choice != 2); 


    return 0; 
} 

Antwort

1
cin >> choice; 

Dies wird die Zahl, die ist eingegeben lesen. Der Nummer, die hier eingegeben wird, folgt jedoch eine neue Zeile, die operator>> nicht lesen wird.

cout << "\n\tAvailable Grade Books: gradeBook\n" << 
     "\tType in the Grade Book you would like to view. "; 

     getline(cin, gb); 

Und das getline() liest nun die Newline, die aus dem Stand der operator>> übrig blieb, statt für die nächste Zeile der Eingabe warten eingegeben werden.

Dies ist ein häufiger Fehler: Mischen operator>> und std::getline(). Obwohl es möglich ist, beide zusammen zu verwenden, müssen zusätzliche Schritte unternommen werden, um dies korrekt zu tun. Die einfachste und der einfachste Weg, Newline-terminierten Textzeilen zu lesen ist std::getline() zu verwenden. Dafür ist es da. Verwenden Sie einfach std::getline(), um immer Texteingabe zu lesen. Wenn Sie es als eine ganze Zahl analysieren wollen, oder etwas anderes, konstruiert ein std::istringstream, und es analysiert.

+0

ahh ich sehe ich behoben! Es funktionierte! Das ist großartig, vielen Dank. –

+0

Die Erklärung ist gut, aber die Lösung ist bisher irrelevant. Nein, das ist keine gute Lösung, also schränken Sie die Verwendung von getline vor dem Extraktionsoperator ein !! Was ist die Rolle von 'cin.flush()' und 'cin.sync()' und 'cin.ignore()'? – Raindrop7

+0

Was ist der Unterschied zwischen 'getline' und' std :: getline' ??? !!!! – Raindrop7

0

ist dies, weil der Eingangspuffer noch eine neue Zeile enthält so die nächste Eingabe in Ihrem Fall getline beeinflussen.

Zum Spülen mischen getline mit Eingabe-Operator ">>" richtig nur der Eingang selbst Puffer:

in Ihrem Beispiel hinzufügen:

//cin.sync(); // or 
    cin.ignore(1, '\n'); 

eine der oben genannten Zeile hinzufügen direkt vor getline so Ihren Code wird aussehen wie:

cin.ignore(1, '\n'); // flushing the buffer 
getline(cin, gb); 
Verwandte Themen