【问题标题】:How to cin a c++ string >= 1024 characters via bash shell? [closed]如何通过 bash shell 输入 c++ 字符串 >= 1024 个字符? [关闭]
【发布时间】:2012-12-31 08:21:05
【问题描述】:

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

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

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

【问题讨论】:

  • 请向我们展示您的 C++ 代码。该问题不太可能与 bash 有关。当你按下回车键时究竟会发生什么?
  • @KeithThompson:这确实看起来像是 bash 不允许在其配置中超过 1024 个字符的行的问题...
  • @DavidRodríguez-dribeas:Bash 不应该影响他的 C++ 程序的执行。实际上,我们需要查看 C++ 程序(或其较小的工作版本)用于调用它的确切 bash 命令。
  • 当我从该 PDF 复制和粘贴时,我得到 uncompilable, barely-readable garbage。你能把它粘贴成文本格式,或者至少是一个可复制的 PDF 格式吗?
  • 更好的是,你能提供一个更小更简单的例子来演示整个事情吗?例如,如果你的整个程序只是string s; getline(cin, s);,它有同样的问题吗?

标签: c++ string macos bash cin


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2019-05-14
    • 1970-01-01
    • 1970-01-01
    • 2019-09-22
    • 2013-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多