在 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 &gt;&gt; rating 始终为零,无论我做什么,它也会返回错误并进入无限循环。然后我以某种方式修复了它,但我不知道如何修复,现在我的 2 getline()s 需要输入两次!

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

My input looks like this

【问题讨论】:

std::getline 不会将\n 留在缓冲区中,格式化提取会!您正在清除输入。 ...您害怕将您的问题标记为重复的问答并没有说在每次提取之间调用 std::istream::ignore 【参考方案1】:

我知道使用std::cin&gt;&gt; 会在最后留下'\n',所以我必须使用cin.ignore()

第一部分是真的。仅当您想通过调用 getline 来跟进它时,第二部分才是正确的。

但是,您甚至在第一次调用 std::cin &gt;&gt; 之前就已经调用了 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 &gt;&gt; rating 仍然出现错误?我的意思是我得到了我输入的号码,但我的 if 声明说这是一个错误。 @DownTownScarf7,您在if (!(cin &gt;&gt; rating)); 行中有一个错误的;,它终止了if 语句。这需要删除。【参考方案2】:

你不应该调用std::istream::ignore(),除非你真的知道缓冲区中已经有一些东西可以忽略。如果你用一个空缓冲区调用它,它首先必须填满它——可能是用其他有用的数据——然后忽略所有内容。

【讨论】:

以上是关于在 getline(cin, string) 之后使用 cin的主要内容,如果未能解决你的问题,请参考以下文章

关于 getline(cin, string) 的 C++ 快速问题

getline(cin,_string);

在 cin 之后使用 getline(cin, s) [重复]

cin 和 getline 混用中需要注意的问题

使用 getline(cin, string) 时,cin 自动取值,无需询问

getline(cin, string_name) 之前需要 cin.get()