在 os X 10.8 上,我尝试通过 bash 将 std 输入重定向到 c++ 字符串。
打印第 1024 个字符后,我什至无法按 Enter。
您能否解释一下问题发生在哪里以及如何解决?
该问题与 C++ 代码或 C++ 代码无关bash
。为了验证这一点,这个简单的程序有同样的问题:
#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而不是在这里找到副本的原因。请参阅那里有关处理此问题的各种方法的讨论。
但是,如果您想从程序内部而不是全局处理它,您可以检查是否stdin
是 a 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
以了解您在做什么以及它将产生什么其他影响(和你是否想做其他事情)。