【发布时间】:2014-09-25 16:47:09
【问题描述】:
我想让我的程序通过 cin 缓冲区读取,直到其中没有任何内容可供读取。
很多地方对此的建议似乎是:
while (cin)
{
cin >> s;
//do stuff with s
}
但是,当我尝试这个时,即使 cin 缓冲区为空,程序也会无限等待输入并执行循环。
while(cin >> s) 做同样的事情。
【问题讨论】:
-
您必须使用 EOF 字符来指示输入的结束(cin 的结束)。您可以在 linux 上使用 ctrl-D 或在 windows 上使用 ctrl-Z 来做到这一点
-
我建议改为
while (cin >> s) { ... }。使用您问题中的代码,当cin没有更多输入时,循环将执行一次,这意味着它将处理最后一个读取元素两次。 -
另外,请注意“缓冲区为空”不是读取失败的条件。如果缓冲区确实为空,但标准输入的文件句柄尚未关闭,
cin >> s将简单地 block 直到有更多输入要读取。正如@icedtrees 所说,您需要在 *nix 上使用 ^D 或在 Windows 上使用 ^Z 来指示 shell 关闭标准输入文件句柄。此时,读取将失败,并且 eof 位将设置为cin。