2017-01-22 197 views
2

标题是误导,因为我更感兴趣的是找到一个替代的解决方案。我的直觉是,检查缓冲区是否为空并不是最理想的解决方案(至少在我的情况下)。C++如何检查是否给std :: cin缓冲区为空

我是新的C++和使用C++一直遵循了Bjarne Stroustrup的编程原则和做法。目前我在第7章,我们在哪里“炼”从第6章计算器(我把对源代码的链接问题的结束。)

基本上,计算器可以采取多用户输入,用分号分隔。

> 5+2; 10*2; 5-1; 
      = 7 
>   = 20 
>   = 4 
> 

但我想摆脱提示字符(“>”),最后两个答案,并再次显示它,只有当用户输入要求。我的第一本能是找到一种方法来检查缓冲区是否为空,如果是,请关闭角色,如果没有,请继续回答问题。但经过一番Google搜索之后,我意识到这项任务并不像我最初想象的那么容易......而且也许这可能不是一个好主意。

我想基本上我的问题是如何摆脱“>”字符为当有多个输入的最后两个答案。但是,如果检查CIN缓冲可能是不是一个坏主意,毕竟,我很想知道如何做到这一点。

的源代码:https://gist.github.com/Spicy-Pumpkin/4187856492ccca1a24eaa741d7417675

头文件:http://www.stroustrup.com/Programming/PPP2code/std_lib_facilities.h

^你需要这个头文件。我认为它是由作者自己写的。

编辑:我没看网上的一些解决方案,绕不过是他们中的诚实没有作出任何意义,我。它一直样4日以来,我拿起了C++和我在编程非常薄的背景,所以有时甚至是谷歌搜索是有点困难..

+1

用棍子戳,看看它是否咆哮。 –

+1

类似的问题:http://stackoverflow.com/questions/3317740/checking-data-availability-before-calling-stdgetline –

+0

在这种情况下,您可以使用'std :: getline'一次读取整行,并显示每行之后的提示 –

回答

1

正如你已经发现,这是一个看似复杂的任务。这是因为这里有多个问题,包括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()即可。如果你确实读了一些东西,把它放到一个缓冲区中,稍后你可以看看。一旦你消耗了所有以前读取的缓冲输入,并且你真的需要等待更多的输入被读取,那么文件描述符将被读取,直到它到达那里。