在os X 10.8上,我试图通过bash将std输入重定向到c++字符串。
在我打印了第1024个字符后,我甚至不能按回车键。
你能解释一下问题发生在哪里以及如何解决吗?
问题与bash
无关,也与c++代码无关。为了验证这一点,这个简单的程序有同样的问题:
#include <iostream>
#include <string>
int main(int, char**) {
std::string s;
std::getline(std::cin, s);
}
这个Python程序也是如此:
#!/usr/bin/python
raw_input()
你可以试着在不同的shell下运行,看看没有什么不同。
问题是,在线路模式下的TTY总是有最大行长,而这个恰好有1024的最大行长。
所以,这甚至不是一个真正的编程问题;这是一个TTY问题。这就是为什么你可以在superuser.com上找到dup,而不是在这里。请参阅关于处理此问题的各种方法的讨论。
然而,如果你想在你的程序中处理它,而不是全局的,你可以检查stdin
是否是一个tty
,如果是,使用termios
函数暂时关闭离线模式。例如,像这样:
#include <iostream>
#include <string>
#include <termios.h>
#include <unistd.h>
int main(int, char**) {
struct termios told;
if (isatty(STDIN_FILENO)) {
tcgetattr(STDIN_FILENO, &told);
struct termios tnew = told;
tnew.c_lflag &= ~ICANON;
tcsetattr(STDIN_FILENO, TCSAFLUSH, &tnew);
}
std::string s;
std::getline(std::cin, s);
if (isatty(STDIN_FILENO)) {
tcsetattr(STDIN_FILENO, TCSAFLUSH, &told);
}
}
然而,你显然想要真正的错误处理,你可能想要使用RIAA来存储和恢复原始的termios设置,你可能应该阅读man termios
来了解你在做什么,以及它会有什么其他的效果(以及你是否想做任何其他的事情)。