【问题标题】:Do stuff with cin buffer until empty用 cin 缓冲区做事直到为空
【发布时间】: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

标签: c++ input buffer cin


【解决方案1】:

如果标准输入连接到终端,程序将等待输入,直到它获得 EOF 条件,您可以在 POSIX 系统上使用 Ctrl-D

发送

【讨论】:

    【解决方案2】:

    你是对的,它将永远等待一个新行。

    你可以这样做:

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

    这样做的目的是当你仍然可以读入 s 然后做一些事情。你最终会到达缓冲区的末尾,它会停止。

    我相信按照您的操作方式,计算机认为它仍然可以输入一些信息。

    【讨论】:

    • 我也试过这个,不幸的是它做了同样的事情。
    猜你喜欢
    • 1970-01-01
    • 2011-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-20
    • 1970-01-01
    相关资源
    最近更新 更多