2016-10-25 5 views
0

私は現在、オプションを除いて、次にテキストの部分が続く場合に必要なプログラムを書いています。テキストがtrueの場合、コードが実行されますか?少なくとも私はそれがうまくいくと思いますが、プログラムはelseに直接行き、getline()というユーザーからの別の入力を要求しない初期条件のためにループを続けますか?なぜプログラムは入力を要求するのではなくループしていますか?

#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; 
} 

答えて

1
cin >> choice; 

これは、入力されたの番号を読み込みます。ただし、ここに入力された数字の後には改行が続き、operator>>は読めません。

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

     getline(cin, gb); 

そしてこのgetline()は今、前operator>>から残った改行を読んで、代わりに入力するための入力の次の行を待っています。

これは一般的な間違いです:operator>>std::getline()を混ぜてください。両方を一緒に使用することは可能ですが、正しく行うためには追加の手順を実行する必要があります。改行で終わるテキスト行を読む最も簡単で簡単な方法は、std::getline()です。それがそれのためのものです。 std::getline()を使用すると、常にテキスト入力を読み取ることができます。それを整数などとして解析する場合は、std::istringstreamを構築して解析してください。

+0

ああ固定されています。出来た!それはすごいです、とても感謝します。 –

+0

説明は良いですが、解決策はこれまでのところ無関係です。これは良い解決策ではありませんので、抽出演算子の前にgetlineの使用を制限してください! 'cin.flush()'と 'cin.sync()'と 'cin.ignore()'の役割は何ですか? – Raindrop7

+0

'getline'と' std :: getline'の違いは何ですか? – Raindrop7

0

これは、入力バッファにまだ改行が含まれているため、これはあなたのケースのgetlineの次の入力に影響します。抽出演算子とのgetlineを混合する

「>>」を正しく入力だけが自分をバッファフラッシュ:

あなたの例に追加します。

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

ので、あなたのコードの右のgetline前に、上記の行の1を追加します次のようになります。

cin.ignore(1, '\n'); // flushing the buffer 
getline(cin, gb); 
関連する問題