如何创建一个while循环,继续循环,直到在C++中“使用流”输入一个键?
Posted
技术标签:
【中文标题】如何创建一个while循环,继续循环,直到在C++中“使用流”输入一个键?【英文标题】:How to create a while loop, that continues looping until a key is entered 'using streams' in C++? 【发布时间】:2019-12-26 17:32:00 【问题描述】:这背后的基本思想是这样做......
std::istringstream in"",ios::ate;
while(in.empty())
//copy contents of 'cin' stream into the 'in'
我在 Bjarne 的书中读到了一些关于流的内容(主要是关于如何使用它们),还阅读了一些关于 ***、关于复制流的内容以及从 istream 对象到 istringstream 对象的答案,但他们没有t 实际上有任何影响,还有一个问题是,如果我使用 getline(),它会等待输入,即使分隔符设置为 '',而我不希望它等待。 *我尝试运行一个for循环,并检查在那段时间键盘是否敲击,进入cin,他们做到了,但仍然 getline(cin, str, ' ') 等待。标题中的主要问题,为什么 getline(cin,str,' ') 等待,即使 cin 有空格?
【问题讨论】:
嗨。这是大多数初学者都会遇到的问题。不幸的是,它与 C++ 无关,更多的是与操作系统和运行时库将您键入的字符提供给std::cin
的方式有关。通常,你必须在你的程序得到任何东西之前输入一个换行符。根据操作系统和库,您可能可以调整一些设置来更改它。
另外,您的代码包含一个错误:只要in
包含单个字符,它就不再是empty
,并且循环只会执行一次。
@Spencer 这就是想法,即。查看是否有任何键被按下,这样只要 in 包含任何内容,它就会让我们跳出循环。
in
是您声明的 stringstream
。它与键盘无关,因此无论您按什么键,in.empty()
都不会改变。
【参考方案1】:
“控制台”与 C++ 的交互主要是系统特定的,在 C++ 中没有任何抽象。在终端屏幕上键入内容时,操作系统通常会处理行编辑,并且仅在输入换行符时才将当前行传递给程序。
通常有一些特定于系统的方法来禁用操作系统级别与终端的交互。在 POSIX 系统上,典型的方法是使用 tcgetattr()
和 tcsetattr()
来启用 cononical 模式,即在标准输入流上设置 ICANON
标志(例如,参见 my answer to a similar question) .
【讨论】:
有没有办法以某种方式从 cin 流中提取,而无需用户按 Enter 键?此外,即使我考虑使用 enter 来获取循环,它也只会在 getline() 语句处等待换行符,而不执行循环。有办法吗?以上是关于如何创建一个while循环,继续循环,直到在C++中“使用流”输入一个键?的主要内容,如果未能解决你的问题,请参考以下文章