首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在getline之后使用cin (cin,string)

在getline之后使用cin (cin,string)
EN

Stack Overflow用户
提问于 2016-02-23 20:55:57
回答 2查看 2.4K关注 0票数 0

我的程序应该创建一个简单的列表:名称(字符串)、评级(Int)、监视/未监视(String)。我理解使用std::cin>>会在最后留下一个'\n',所以我不得不使用cin.ignore(),但它似乎也以某种方式失败了。

代码语言:javascript
复制
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总是为零,无论我做了什么,它还返回错误,并进入一个无限循环。然后,我以某种方式修复了它,但我不知道怎么做,现在我的2getline()需要输入两次!

有人能解释一下为什么这对我不管用吗?这段代码的哪些部分是不必要的?

我的输入如下所示

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-23 21:07:31

我知道使用std::cin>>会留下一个'\n',所以我不得不使用cin.ignore()

第一部分是真的。第二部分只有在您想通过调用getline来跟踪它时才是正确的。

但是,甚至在第一次调用cin.ignore()之前就有对std::cin >>的调用。这将期望您输入行,这些行可以是空行,但是行将被读取和丢弃。

换行:

代码语言:javascript
复制
cin.ignore(numeric_limits<streamsize>::max(), '\n');
getline(cin, name);
cin.ignore(numeric_limits<streamsize>::max(), '\n');

带着

代码语言:javascript
复制
getline(cin, name);

再过一段时间,你就有了:

代码语言:javascript
复制
getline(cin, watch);
cin.ignore(numeric_limits<streamsize>::max(), '\n');

这里不需要给cin.ignore()打电话。把它移开。

票数 0
EN

Stack Overflow用户

发布于 2016-02-23 21:06:55

您不应该调用std::istream::ignore(),除非您确实知道缓冲区中已经存在需要忽略的东西。如果你用一个空缓冲区调用它,它将首先填充它--很好地用其他有用的数据--然后忽略一切。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35587980

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档