多次从 std::cin 读取 -- Linux 和 Mac OS X 上的行为不同
Reading from std::cin multiple times -- different behavior on Linux and Mac OS X
我想从标准输入中读取一些数字,处理它们,然后读取下一组数字。
我想出了在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<Return>2<Return>^D
,获取一些输出,键入 3<Return>4<Return>^D
,获取更多输出,程序终止。
但是,在Mac OS 10.10上,使用相同的GCC版本,程序将不接受第二轮输入,而是在第一次点击^D
后两次输出第一个数字序列。
- 为什么会出现不一致的行为?是否有可能解决它?
- 接受两次输入的惯用方法是什么?
- 在我的用例中,第一堆数字最终可能会从文件或管道中读取。在这种情况下,我如何以交互方式请求其他输入。
我不是那么熟悉,但是,这家伙有一个类似的问题: Mac osx 终端中的信号 EOF
默认情况下,OS X(以前称为 Mac OS X)终端可在行首按下 control-D 时识别 EOF。
具体来说,实际操作是,当按下 control-D 时, 终端输入缓冲区中的所有字节都发送到正在运行的 使用终端进行处理。在一行的开头,没有字节 缓冲区,因此进程被告知有零字节可用,并且 这充当 EOF 指标。
此过程兼作向流程传递输入的方法 在行尾之前:用户可以键入一些字符并按 control-D,字符将立即发送到进程, 无需通常等待输入/返回被按下。在此之后 执行"立即发送所有缓冲字节"操作,无字节 留在缓冲区中。因此,当第二次按下 control-D 时, 它与一行的开头相同(不发送字节,并且 进程被赋予零字节),它的作用类似于 EOF。
您可以使用命令"man 4 tty"在终端中。默认行规则是termios。您可以 通过使用命令"man 特米奥斯"。
埃里克·波皮希尔的接受答案
我没有OSX可以测试,但也许这可以解释行为
- libprotobuf 检查在 Mac OS 上执行程序时失败
- C++读取用户输入而不按回车键(Mac OS X),与Turbo Pascal中的读取键相同
- 如何在 MAC OS c/c++ 中阻止 USB 存储设备
- Mac os x app bundle 在下载并运行时崩溃,但在终端或更改 Info.plist 时运行良好
- const 如何防止写入特定内存 [Clang, Mac OS]
- 如何在 Mac OS 上安装 boost-mpi 及其对 clang 的依赖关系?
- 在 Mac OS 中将 QT 与 CMAKE 集成
- Homebrew OS X OpenCV - 在另一台Mac上运行时寻找dylib
- 从我的2d数组中的一列返回的字符串值被压缩为一个字符串(在Mac os上打开Windows txt文件)
- VK_ERROR_INCOMPATIBLE_DRIVER with Mac OS and Vulkan MoltenVK
- 我无法在C++(Clion,Mac OS)中运行Gurobi
- 如何在Mac OS的发布版本中包含Qt库?
- 如何将C++项目从 32 位迁移到 64 位以支持 MAC OS 10.14(莫哈韦)?
- 在 Mac OS x 中制造期间出现错误未知类型名称"constexpr"
- 无法在 Mac OS X 上链接静态资源库
- 在Mac OS X Mountain Lion(或更高版本)和Linux上使用X11/Xlib.h
- Mac OS c++ Link OpenCV and libtiff
- 使用 c++ 在 Mac OS X 上启动"new email"窗口
- 在 Mac OS 上运行 x11
- 为什么 Mac OS 指定的 TCP 端口不侦听?