C++ 中非阻塞式的用户输入

作者: , 共 498 字 , 共阅读 0

如果我们用std::getline或者简单的std::cin >>获取用户输入,有一个问题是,它会阻塞掉整个程序,用户必须有输入后才能继续执行。如果这个输入是单独的线程,它还会阻止整个程序的退出。

这个时候可以用下面这个函数,非阻塞式的用户输入,会检查用户是否在输入,没有的话就直接返回空:

#include <iostream>
#include <optional>

std::optional<std::string> noblock_input(std::istream& in = std::cin)
{
    if (in.rdbuf()->in_avail() != -1) {
        char buffer[1024];

        in.getline(buffer, sizeof(buffer));

        return buffer;
    }

    return {};
}

注意,该实现在用户已有输入字符的情况下,会等到用户输入到按下回车为止,在这期间是也是阻塞的。

Q. E. D.

类似文章:
编程 » C++
要在C++中运行系统命令,可以直接使用std::system函数:
编程 » C++
有两种方法,一种在线程的调用函数内部设置,还有一种是在外部对指定线程变量做设置。
编程 » C++, popen
popen函数可以获取比std::system函数更详细的程序输出。只是正常调用 popen 只能获取 stdout 的输出,而 stderr 的输出被忽略。
编程 » C++
现在一般不能用 sprintf 和 strcpy ,推荐使用 snprintf 和 strncpy ,以防止缓冲区溢出:
std::thread是 C++ 11 新引入的标准线程库。在同样是 C++ 11 新引入的 lambda 函数的辅助下,std::thread用起来特别方便:
编程 » C++, 智能指针
理论上而言,当 C++提供了std::unique_ptr, C++的程序就不应该出现普通指针了。所有普通指针都可以用std::unique_ptr代替,避免手动删除对象。
编程 » C++, Boost, 数据容器
Boost.Intrusive 是一个很有意思的实现,里面实现了很多侵入式容器,在特定环境下,可以大大提升性能。
编程 » C++, 代码片段
主要函数是timespec_get,可参考https://zh.cppreference.com/w/c/chrono/timespec_get
编程 » C++, Boost, 智能指针
如果理解了侵入式容器,侵入式智能指针也很容易理解。传统的智能指针std::shared_ptr使用了和数据无关的引用计数,这带来两个问题:
编程 » C++, folly
folly::fbstring是一个完全兼容std::string的类,可以做到无缝替换,而且性能更高。其代码参见https://github.com/facebook/folly/blob/master/folly/FBString.h
跟着绿野的商业队伍去妫水河骑行,每人 198 元,惠新西街南口大巴接送往返。自行车取车地是世界葡萄博览园的南门。自驾也可以在此处租车,每车 150 元。
IT » cronjob
第一步,在当前服务器导出计划任务: