标题具有误导性,因为我对寻找替代解决方案更感兴趣。我的直觉是,检查缓冲区是否为空不是最理想的解决方案(至少就我而言)。
我是C++的新手,并且一直遵循Bjarne Stroustrup的使用C++的编程原理和实践。我目前在第7章中,我们在第6章中“完善”计算器。(我将把源代码的链接放在问题的末尾。)
基本上,计算器可以接受用户的多个输入,并以分号分隔。
> 5+2; 10*2; 5-1;
= 7
> = 20
> = 4
>
但我想摆脱最后两个答案的提示字符('>'),并仅在要求用户输入时再次显示它。我的第一个直觉是找到一种检查缓冲区是否为空的方法,如果是,则找出字符,如果不是,则继续给出答案。但是经过一番谷歌搜索之后,我意识到任务并不像我最初想象的那么容易...而且也许这并不是一个好主意。
我想本质上我的问题是,当有多个输入时,如何摆脱最后两个答案的'>'字符。但是,如果可以检查cin缓冲区,并且毕竟不是一个坏主意,我很想知道如何去做。
源代码:https://gist.github.com/Spicy-Pumpkin/4187856492ccca1a24eaa741d7417675
头文件:http://www.stroustrup.com/Programming/PPP2code/std_lib_facilities.h
^您需要此头文件。我认为它是作者自己写的。
编辑:我确实在网上寻找了一些解决方案,但是老实说,这些解决方案对我来说都没有任何意义。自从学习C++到现在已经有4天了,并且我在编程方面还很瘦,所以有时甚至谷歌搜索也有些困难。
最佳答案
正如您所发现的,这是一项看似复杂的任务。这是因为C++库和实际的基础文件同时存在多个问题。
C++库std::cin
和C++输入流使用中间缓冲区std::streambuf
。来自基础文件或交互式终端的输入不是逐字符读取的,而是在可能的情况下按适当大小的块读取。比方说:
int n;
std::cin >> n;
假设完成此操作后,
n
包含数字42
。好吧,实际上发生的是,std::cin
很可能不只读取两个字符“4”和“2”,但是std::cin
流上还有其他可用的字符。其余字符存储在std::streambuf
中,在实际读取基础文件之前,下一个输入操作将读取它们。同样,上面的
>>
实际上没有从文件中读取任何内容,而是从std::streambuf
中获取了“4”和“2”字符,这些字符在上一次输入操作之后保留在那里。可以检查底层的
std::streambuf
,并确定那里是否有未读的东西。但这并不能真正帮助您。如果您要执行上面的
>>
运算符,则查看了底层的std::streambuf
,发现它包含单个字符“4”,这并不能告诉您太多。您需要知道std::cin
中的下一个字符是什么。它可以是空格或换行符,在这种情况下,您从>>
运算符中获得的全部是4。或者,下一个字符可能是“2”,在这种情况下,>>
将至少吞下“42”,甚至可能更多数字。您当然可以自己实现所有这些逻辑,查看底层的
std::streambuf
,并确定它是否将满足您即将进行的输入操作。恭喜:您刚刚重新发明了>>
运算符。您最好自己自己解析输入,一次输入一个字符。基础文件
您确定
std::cin
没有足够的输入来满足您的下一个输入操作。现在,您需要知道std::cin
上的输入是否可用。现在,这成为特定于操作系统的主题。标准的C++库不再涵盖此内容。
结论
这是可行的,但在所有实际情况下,最好的解决方案是使用特定于操作系统的方法,而不是C++输入流,然后自己读取和缓冲输入。例如,在Linux上,经典方法是将fd 0设置为非阻塞模式,以使
read()
不被阻塞,并确定是否有可用的输入,只需尝试read()
即可。如果您确实阅读了某些内容,请将其放入缓冲区中,以便以后查看。使用完所有先前读取的缓冲输入后,您确实需要等待更多输入被读取,使用poll()
文件描述符,直到它存在为止。关于c++ - C++如何检查std::cin缓冲区是否为空,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41786333/