4

在 os X 10.8 上,我尝试通过 bash 将 std 输入重定向到 c++ 字符串。

打印第 1024 个字符后,我什至无法按 Enter。

您能否解释一下问题发生在哪里以及如何解决?

4

1 回答 1

4

该问题与 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以了解您在做什么以及它将产生什么其他影响(和你是否想做其他事情)。

于 2013-01-16T23:04:19.673 回答