如何通过 bash shell 输入 c++ 字符串 >= 1024 个字符?

How to cin a c++ string >= 1024 characters via bash shell?

本文关键字:1024 字符 gt bash 何通过 shell 输入 字符串 c++      更新时间:2023-10-16

在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来了解你在做什么,以及它会有什么其他的效果(以及你是否想做任何其他的事情)。