c++ - 如何创建一个while循环,继续循环,直到在C++中“使用流”输入一个键?
问题描述
这背后的基本思想是这样做......
std::istringstream in{"",ios::ate};
while(in.empty()){
//copy contents of 'cin' stream into the 'in'
}
我在 Bjarne 的书中读了一些关于流的内容(主要是关于如何使用它们),还阅读了一些关于 stackoverflow 的答案,关于复制流的内容,以及从 istream 对象到 istringstream 对象,但实际上并没有任何效果,还有一个问题是,如果我使用 getline(),它会等待输入,即使分隔符设置为“”,而我不希望它等待。*我尝试运行一个for循环,并检查在那段时间键盘是否敲击,进入cin,他们做到了,但仍然 getline(cin, str, ' ') 等待。对于标题中的主要问题,为什么 getline(cin,str,' ') 等待,即使 cin 有空格?
解决方案
“控制台”与 C++ 的交互主要是系统特定的,在 C++ 中没有任何抽象。在终端屏幕上键入内容时,操作系统通常会处理行编辑,并且仅在输入换行符时才将当前行传递给程序。
通常有系统特定的方法来禁用与终端的操作系统级交互。在 POSIX 系统上,典型的方法是使用tcgetattr()
和tcsetattr()
启用圆锥模式,即ICANON
在标准输入流上设置标志(例如,参见我对类似问题的回答)。
推荐阅读
- azure - Azure AD OAuth 客户端凭据授予流
- c++ - Ifstream 遇到创建随机异常
- sql - 如何删除输出中的重复记录
- python - Sklearn:克隆自定义转换替换 __init__ 字典中的值
- google-apps-script - 将所有工作表上的现有添加、删除和移动同一行更改为批处理版本
- c++ - 派生类中的“重命名”成员变量
- python - ElasticSearch DSL -> 组合多个过滤器并消除元数据
- javascript - 如何解决它:“未捕获的 TypeError:无法读取 null 的属性 'addEventListener'”...?
- azure - Azure 监视器指标警报 - 如果我遗漏维度会发生什么?
- java - 未知错误:在路径上找不到类:DexPathList