2014-09-25 50 views
0

我想通过cin缓冲区读取我的程序,直到它没有任何内容读取。用cin缓冲区做东西直到空

什么了很多地方似乎暗示了这是:

while (cin) 
{ 
    cin >> s;  
    //do stuff with s 
} 

然而,当我尝试这一点,即使在CIN缓冲区是空的,用于输入和执行循环的程序只是无限地等待。

这样做(cin >> s)完全相同的事情。

+0

您必须使用EOF字符表示输入(CIN结束)结束。你可以使用linux上的ctrl-D或windows上的ctrl-Z来做到这一点。 – icedtrees 2014-09-25 16:50:23

+3

我建议'while(cin >> s){...}'来代替。用你的问题中的代码,当'cin'没有更多输入时,循环会执行一次,这意味着它将处理最后一次读取元素两次。 – cdhowie 2014-09-25 16:50:41

+0

另请注意,“缓冲区为空”不是读取失败的条件。如果缓冲区确实是空的,但是stdin的文件句柄没有关闭,'cin >> s'会直接*阻塞*,直到有更多的输入需要读取。正如@icedtrees所说,您需要在Windows上的* nix或^ Z上使用^ D,以便指示shell关闭stdin文件句柄。此时,读取将失败,eof位将被设置在'cin'上。 – cdhowie 2014-09-25 17:01:02

回答

2

如果标准输入连接到终端,程序将等待输入直到它得到一个EOF条件,您可以对POSIX系统发送一个按Ctrl-d

0

你是正确的,它将等待永远换一个新的路线。

你可以做的是这样的:

while(cin >> s){ 
    //do stuff with s 
} 

这样做是什么,而你仍然可以读入当时的做的东西。你最终会在缓冲区结束时停止。

我相信,你正在做的方式,电脑认为它仍然可以有进来的一些信息。

+0

我也试过这个,不幸的是它做了同样的事情。 – aredscout 2014-09-25 16:58:00