Using cin AFTER getline(cin, string)
Using cin AFTER getline(cin, string)
我的程序应该创建一个简单的列表:name(string),rating(int),watched/unwatched(string)。我知道使用std::cin>>
最后会留下一个'n'
,所以我必须使用cin.ignore()
但似乎它也以某种方式失败了。
void write()
{
int rating;
string name, watch, wprint;
cout << "Modifying" << endl;
f_list.open ("TextFile.txt", ios::app);
cout << "Name/Title?" << endl;
cin.ignore(numeric_limits<streamsize>::max(), 'n');
getline(cin, name);
cin.ignore(numeric_limits<streamsize>::max(), 'n');
cout << "Rating?" << endl;
if (!(cin >> rating));
{
cin.clear();
cout << "Error again" << endl;
}
cin.ignore(numeric_limits<streamsize>::max(), 'n');
cout << "Watched or unwatched?" << endl;
getline(cin, watch);
cin.ignore(numeric_limits<streamsize>::max(), 'n');
if (watch == "w" || watch == "yes" || watch == "y")
{
watch = "W";
wprint = "Watched";
}
else
{
watch = "DW";
wprint = "Didn't watch";
}
cout << name << " (" << rating << "/10) (" << wprint << ") has been added to the list" << endl;
f_list << name << " " << rating << " " << watch << endl;
}
首先,无论我做什么,我的cin >> rating
始终为零,它还返回错误并进入无限循环。然后我以某种方式修复了它,但我不知道如何,现在我的 2 getline()
需要输入两次!
有人可以解释为什么这对我不起作用吗?这段代码的哪些部分是不必要的?
我的输入如下所示
我知道使用
std::cin>>
最后会留下'n'
,所以我必须使用cin.ignore()
第一部分是真的。仅当您想通过调用getline
来跟进它时,第二部分才是正确的。
但是,您甚至可以在第一次调用cin.ignore()
之前调用std::cin >>
。这将期望您输入行,这些行可能是空行,但行不是,这些行将被读取并丢弃。
替换以下行:
cin.ignore(numeric_limits<streamsize>::max(), 'n');
getline(cin, name);
cin.ignore(numeric_limits<streamsize>::max(), 'n');
用只是
getline(cin, name);
再过一会儿,你有:
getline(cin, watch);
cin.ignore(numeric_limits<streamsize>::max(), 'n');
您不需要在这里cin.ignore()
电话。删除它。
除非你真的知道缓冲区中已经有一些东西需要忽略,否则你不应该调用std::istream::ignore()
。 如果你用一个空缓冲区调用它,它首先必须填满它 - 可能用其他有用的数据--,然后忽略所有内容。
相关文章:
- C++中的cin.ignore()函数不适用于整个流
- cppcheck在const std::string[]上引发警告
- 在while循环中输入带有std::cin的字符串后,控制台会输出大量胡言乱语
- 将std::string传递给WriteConsole API
- Problems with std::cin.fail()
- 为std::string的某个索引赋值
- std::string 是否仅适用于 c++ 中的'std::cin'
- std::getline(std::cin, string) 可能因键盘输入失败的方式
- 为什么我们需要在getline(cin,string)之前使用cin.ignore()
- 当使用getline(cin,string)时,CIN会自动获取其值而不询问
- C ++多个CIN默认值(如果未输入),则添加到map<string,vector<double>>
- 为什么像cin,cout,string等东西被认为是对象
- std::cin >> std::string 是如何实现的?
- Using cin AFTER getline(cin, string)
- 关于getline(cin,string)的C++快速问题
- getline(cin,string)与cin.ignore()一起不工作
- 输入Std::cin与直接赋值Std::string变量不一样
- How cin to string?
- 如何使用std::cin.getline()与string
- Compare string对cin不起作用