多次从std :: cin读取 - Linux和Mac OS X上的不同行为

时间:2016-04-21 09:38:31

标签: c++ linux macos stdin

我想从标准输入中读取一些数字,处理它们,然后读取下一组数字。

我提出了解决方案来阅读EOF中的char字符并清除eofbit,failbit和badbit。以下代码适用于UCCntu 14.04和GCC 4.9.2:

#include <iostream>
#include <vector>

int main() {
    std::vector<double> a;
    std::vector<double>::iterator it;
    double x;
    while(std::cin >> x) {
        a.push_back(x);
    }
    std::cout << "First bunch of numbers:" << std::endl;
    for (it = a.begin(); it != a.end(); ++it) {
        std::cout << *it << std::endl;
    }

    // get crap out of buffer
    char s;
    std::cin >> s;
    std::cin.clear();

    // go for it again
    while (std::cin >> x) {
        a.push_back(x);
    }
    std::cout << "All the numbers:" << std::endl;
    for (it = a.begin(); it != a.end(); ++it) {
        std::cout << *it << std::endl;
    }

    return 0;
}

因此,在Ubuntu上我可以输入1<Return>2<Return>^D,获取一些输出,输入3<Return>4<Return>^D,获得更多输出,程序终止。

在Mac OS 10.10上但是,使用相同的GCC版本,程序将不接受第二轮输入,但在点击{后两次输出第一个数字序列{1}}第一次。

  • 为什么会出现不一致的行为?有可能解决它吗?
  • 两次接受输入的惯用方法是什么?
  • 在我的用例中,第一批数字最终可能会从文件或管道中读取。如何在这种情况下以交互方式请求额外输入。

1 个答案:

答案 0 :(得分:-1)

我不是那么熟悉但是,这家伙有类似的问题:Signal EOF in mac osx terminal

  

默认情况下,OS X(以前的Mac OS X)终端在行开头按下control-D时识别EOF。

     

详细说明,实际操作是当按下control-D时,   终端输入缓冲区中的所有字节都被发送到运行中   使用终端的过程。在行的开头,没有字节   缓冲区,因此告诉进程有零字节可用,并且   这是一个EOF指标。

     

此过程兼作向流程提供输入的方法   在行结束之前:用户可以键入一些字符并按   control-D,字符将立即发送到进程,   没有通常的等待进入/返回被按下。在这之后   “立即发送所有缓冲的字节”执行操作,没有字节   留在缓冲区。所以,当第二次按下control-D时,   它与一行的开头相同(没有发送字节,而且   进程被赋予零字节),它就像一个EOF。

     

您可以使用命令“man 4”了解有关终端行为的更多信息   tty“在终点站。默认的线路规则是termios。您可以   通过使用命令“man。”了解有关termios线路规则的更多信息   的termios”。

Eric Postpischil的接受的答案

我没有OSX进行测试,但也许这解释了行为