c++ - 如何通过 bash shell cin a c++ 字符串 >= 1024 个字符?

标签 c++ string macos bash cin

<分区>

在 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/

相关文章:

macos - OSX 上 Vagrant 的可公开访问 IP

c++ - 如何在 C++14 中编写通用转发 lambda?

C++使用参数在数组中分配和构造对象

c++ - SKIA::获取 Canvas 内文本的文本高度

string - 拆分由给定对象类型分隔的字符串

macos - Elasticsearch OS X : Could not initialize class org. elasticsearch.common.xcontent.XContentFactory

C++/CX - DataReader 越界异常

c# - 以 MB 为单位的长度

string - 在 Swift 中将 CGFloat 转换为字符串

ios - cocoa : "perspective transform"可用吗?