如何从std :: cin缓冲区中删除所有先前的输入

时间:2018-01-20 23:15:11

标签: c++ linux windows cin portability

我正在编写一个显示对话框的简单通用函数。我打算在我的代码中从不同的地方调用它。问题是我需要在函数开头清除输入缓冲区,因此前一个输入的延迟数据不会被解释为答案。

这必须是一个非常普遍的想法,所以我相信C ++标准库提供了一些功能。但是,我没有找到它的运气。

这是我想要完成的一个实际例子:

#include <iostream>
#include <string>

unsigned dialog(const char question[], const char answers[])
{
    //TODO reset std::cin
    while (true)
    {
        std::cout << question << " [";
        for (unsigned i = 0; answers[i] != '\0'; ++i)
        {
            if (i != 0)
                std::cout << '/';
            std::cout << answers[i];
        }
        std::cout << ']' << std::endl;
        std::string line;
        std::getline(std::cin, line);
        if (line.empty())
        {
            for (unsigned i = 0; answers[i] != '\0'; ++i)
                if (answers[i] >= 'A' && answers[i] <= 'Z')
                    return i;
        } else if (line.length() == 1)
        {
            const char answer = toupper(line[0]);
            for (unsigned i = 0; answers[i] != '\0'; ++i)
                if (answer == toupper(answers[i]))
                    return i;           
        }
    }
}

int main()
{
    // --- optional part ---
    std::cout << "Write something to clutter the input buffer..." << std::endl;
    std::string foo;
    std::cin >> foo; //User enters "aaa bbb ccc"
    // --- optional part end ---
    return dialog("Do you like this question?", "Yn");
}

interactive version

this other similar question不同,我正在寻找一些便携式解决方案。它应该至少在Windows和任何Linux系统中得到支持。

还有this question与我的非常相似。但是,所有答案似乎都假设输入缓冲区此刻不为空。如果我把它放在我的对话框之前并且此时输入是空的(例如直接在程序启动之后),则会导致用户需要按Enter以在屏幕上显示我的对话框的情况。该问题的一些答案不假设缓冲区不为空,基于依赖于标准库实现的函数。

0 个答案:

没有答案