我目前正在编写一个程序,除了一个选项,然后是一段文本,如果是一段文字。如果文本为真,则执行一段代码?至少我认为它是如何工作的,然而,程序直接进入其他并且保持循环,因为初始条件它不会询问用户的另一个输入是getline()吗? / p>
#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;
}
答案 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
并解析它。
答案 1 :(得分:0)
这是因为输入缓冲区仍然包含换行符,因此这会影响你的案例getline中的下一个输入。
将getline与提取运算符混合&#34;&gt;&gt;&#34;正确地只是自己刷新输入缓冲区:
在您的示例中添加:
//cin.sync(); // or
cin.ignore(1, '\n');
在getline之前添加以上一行,以便您的代码如下所示:
cin.ignore(1, '\n'); // flushing the buffer
getline(cin, gb);