使用cin AFTER getline(cin,string)

时间:2016-02-23 20:55:58

标签: c++ cin getline ignore

我的程序应该创建一个简单的列表:name(字符串),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()需要输入TWICE!

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

My input looks like this

2 个答案:

答案 0 :(得分:0)

除非您确实知道缓冲区中已存在某些内容,否则不应调用std::istream::ignore()。如果你使用空缓冲区调用它,它首先必须填充它 - 可能是其他有用的数据 - 然后忽略所有内容。

答案 1 :(得分:0)

  

我了解使用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()。删除它。