Using cin AFTER getline(cin, string)

Using cin AFTER getline(cin, string)

本文关键字:cin string getline AFTER Using      更新时间:2023-10-16

我的程序应该创建一个简单的列表: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()。 如果你用一个空缓冲区调用它,它首先必须填满它 - 可能用其他有用的数据--,然后忽略所有内容。