【问题标题】:Clear input buffer including newline清除输入缓冲区,包括换行符
【发布时间】:2012-03-13 14:06:06
【问题描述】:

我有一个计时器线程,它会在未来执行 5 秒,并有一个循环等待它完成执行。然后程序在用户按回车时结束。我注意到,在等待循环时,输入缓冲区被接受,并用于完成程序,任何后续的输入命中都被输入到命令行

我想忽略在“按回车键退出”之前输入的所有输入,包括回车。自从我使用 C++ 以来已经有一段时间了,我不记得如何做到这一点(我已经搜索过 SO 和 Google,但找不到这个特定问题的答案)。这是我的例子:

std::cout << "Timer test: wait 5 seconds\n";
boost::asio::io_service test_io;
deadline_timer test_timer(test_io, posix_time::seconds(5));

int testInt = 0;
auto asynctest = [&testInt](const boost::system::error_code&) {
    std::cout << "Running asynctest()\n";
    testInt = 5;
};

std::cout << "Starting asynchtest, which should output in 5 seconds\n";
test_timer.async_wait(boost::bind<void>(asynctest, boost::asio::placeholders::error));

while(testInt != 5) {
    std::cout << ". ";
    boost::this_thread::sleep(boost::posix_time::milliseconds(200));
}

// How do I clear all input from the input stream here so that if the user hit enter
//    during the timer countdown it will be cleared and user still must hit enter to
//    exit program?

std::cout << "Press enter to exit\n";
std::cin.ignore(80, '\n');
return 1;

广告

【问题讨论】:

    标签: c++ boost input timer flush


    【解决方案1】:

    在纯 C++ 级别无法做到这一点;你必须放弃 到操作系统级别,或使用一些第三方库,如curses(或 也许是一些异步 IO 库,如果你能让他们阅读cin 异步)。

    【讨论】:

    • Boost 的某些功能无法做到这一点?另外,顺便说一句,我正在使用 Visual C++ 工作,显然 MS 提供了执行此操作的工具(未经测试 - 请参阅 tech-archive.net/Archive/VC/microsoft.public.vc.language/…),但这违背了目的,因为这不是生产代码,而是自我测试,看看我有多生疏上午。
    • @taz 我不知道boost::asio 是如何与开放的istream 交互的;原则上,至少,如果您可以将异步输入连接到您感兴趣的流,您可以使用非阻塞读取读取并丢弃其中的所有内容。但是,我可能不会尝试使其与cin 一起使用;异步读取和cins 缓冲区之间的交互可能是未指定的。
    • 好吧,显然我已经生锈了,可以立即尝试标准不支持的东西。从初步研究看来你是对的,这可能适用于boost::asio,可能需要线程。 C++ iostreams 不做非阻塞 IO。我不打算进一步测试,因为我只是在练习。希望这可以避免将来有人头疼。谢谢你的帮助。延伸阅读:gamedev.net/topic/538714-asynchronous-console-inputbytes.com/topic/c/answers/841283-how-make-non-blocking-call-cin
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多