4

OS X 10.8 で、bash 経由で std 入力を c++ 文字列にリダイレクトしようとしました。

1024 番目の文字を印刷した後、Enter キーを押すことさえできません。

問題が発生する場所と解決方法を教えてください。

4

1 に答える 1

4

bashこの問題は、または C++ コードとは関係ありません。これを確認するために、この簡単なプログラムには同じ問題があります。

#include <iostream>
#include <string>
int main(int, char**) {
    std::string s;
    std::getline(std::cin, s);
}

この Python プログラムも同様です。

#!/usr/bin/python
raw_input()

また、さまざまなシェルで実行してみて、違いがないことを確認できます。

問題は、ライン モードの TTY には常に最大行長があり、これはたまたま最大行長が 1024 であることです。

つまり、これは実際にはプログラミングの問題ではありません。TTYの質問です。これが、ここではなく、 superuser.comで複製を見つけることができる理由です。これに対処するためのさまざまな方法については、そこでの議論を参照してください。

ただし、グローバルではなくプログラム内から処理したい場合は、 が であるかどうかを確認stdintty、そうである場合は関数を使用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 に答える