我想从标准输入中读取一些数字,处理它们,然后读取下一组数字。
我提出了解决方案来阅读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}}第一次。
答案 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进行测试,但也许这解释了行为