<分区>
在 os X 10.8 上,我尝试通过 bash 将 std 输入重定向到 c++ 字符串。
在我打印第 1024 个字符后,我什至无法按回车键。
能否请您解释一下问题出在哪里以及如何解决?
<分区>
在 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 找到一个拷贝而不是这里。请参阅那里关于处理此问题的各种方法的讨论。
然而,如果你想在你的程序中处理它,而不是全局处理,你可以检查 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
以了解您的内容正在做以及它会产生什么其他影响(以及您是否想做任何其他事情)。
关于c++ - 如何通过 bash shell cin a c++ 字符串 >= 1024 个字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14368168/