在 getline(cin, string) 之后使用 cin
Posted
技术标签:
【中文标题】在 getline(cin, string) 之后使用 cin【英文标题】:Using cin AFTER getline(cin, string) 【发布时间】:2016-02-23 20:55:57 【问题描述】:我的程序应该创建一个简单的列表: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()
s 需要输入两次!
有人能解释一下为什么这对我不起作用吗?这段代码的哪些部分是不必要的?
My input looks like this
【问题讨论】:
std::getline
不会将\n
留在缓冲区中,格式化提取会!您正在清除输入。
...您害怕将您的问题标记为重复的问答并没有说在每次提取之间调用 std::istream::ignore
。
【参考方案1】:
我知道使用
std::cin>>
会在最后留下'\n'
,所以我必须使用cin.ignore()
第一部分是真的。仅当您想通过调用 getline
来跟进它时,第二部分才是正确的。
但是,您甚至在第一次调用 std::cin >>
之前就已经调用了 cin.ignore()
。这将要求您输入行,这可能是空行,但行仍然会被读取并丢弃。
替换行:
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()
。删除它。
【讨论】:
好的,谢谢!我现在明白了,我还有一个问题:为什么我的cin >> rating
仍然出现错误?我的意思是我得到了我输入的号码,但我的 if
声明说这是一个错误。
@DownTownScarf7,您在if (!(cin >> rating));
行中有一个错误的;
,它终止了if
语句。这需要删除。【参考方案2】:
你不应该调用std::istream::ignore()
,除非你真的知道缓冲区中已经有一些东西可以忽略。如果你用一个空缓冲区调用它,它首先必须填满它——可能是用其他有用的数据——然后忽略所有内容。
【讨论】:
以上是关于在 getline(cin, string) 之后使用 cin的主要内容,如果未能解决你的问题,请参考以下文章
关于 getline(cin, string) 的 C++ 快速问题
在 cin 之后使用 getline(cin, s) [重复]