【问题标题】:Reading from std::cin multiple times -- different behavior on Linux and Mac OS X多次读取 std::cin —— Linux 和 Mac OS X 上的不同行为
【发布时间】:2016-08-14 10:04:15
【问题描述】:

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

我想出了读取char 中的EOF 字符并清除eofbit、failbit 和badbit 的解决方案。以下代码适用于带有 GCC 4.9.2 的 Ubuntu 14.04:

#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&lt;Return&gt;2&lt;Return&gt;^D,获得一些输出,输入 3&lt;Return&gt;4&lt;Return&gt;^D,获得更多输出,然后程序终止。

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

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

【问题讨论】:

  • 第一次发送EOF 后,在使用之前尝试调用std::cin.clear()
  • 这是控制台行为,不是 C++ 代码。在 MacOS 中,它可能在发送 EOF like in Windows 后关闭输入流

标签: c++ linux macos stdin


【解决方案1】:

我不是很熟悉,但是这个人有一个类似的问题:Signal EOF in mac osx terminal

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

具体来说,实际操作是,当按下control-D时, 终端输入缓冲区中的所有字节都发送到正在运行的 使用终端处理。在一行的开头,没有字节在 缓冲区,所以进程被告知有零字节可用,并且 这充当 EOF 指示器。

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

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

接受 Eric Postpischil 的回答

我没有 OSX 可以测试,但这也许可以解释这种行为

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-27
    • 2012-07-01
    • 2018-11-09
    • 2013-03-09
    • 2013-07-31
    • 2015-08-11
    • 1970-01-01
    相关资源
    最近更新 更多