1

キーボードからの入力を受け入れるプログラムがあるか、あるいは次のようなファイルからのリダイレクトされた入力を受け入れるプログラムがあるとします。

#include <iostream>

using namespace std;

int main() {
  string str;
  while (getline(cin, str)) {
    if(str.compare("exit") == 0)
      return 0;
  }
  return 0;
}

この実装では、キーボード入力を使用するプログラムのインスタンスは「exit」と入力すると終了し、ファイル入力を使用するプログラムのインスタンスはEOFで終了することを期待しています。

ファイル入力を使用するプログラムのインスタンスが実行されている場合、終了するのではなく、EOFに到達したときにキーボード入力を許可するような機能を実装したいと思います。ファイル入力が終了するとfalseが返されるため、whileループの条件としてこれが不可能であることを示唆する調査を行いました。また、キーボードを受け入れたいことgetlineを伝える方法がわかりません。cinその時の入力。

cinでは、ファイルの実行中に、ファイル入力の受け入れから代わりにキーボード入力の受け入れに切り替えることは可能ですか?そうでない場合、その理由を説明していただけますか?

4

2 に答える 2

2

できますよ。このstd::cin.rdbuf()関数は、別のI/Oバッファをに再割り当てできcinます。ただし、最初にバッファを取得する必要があります。

シェルを使用してファイルをにリダイレクトするstdinと、ファイルがキーボードに置き換わります。それ以外の場合、シェルはキーボードをプログラムに接続する役割を果たします。そのため、これであなたは自分で任せられます。C++はキーボードインターフェイスを定義していません。プラットフォーム固有のものを使用したい場合(おそらくそれだけの価値はない)を除いて、プログラムの使用規則を少し変更する必要があります。

最も標準的な解決策は、入力ファイルをコマンドラインオプションとして追加することです。std::filebufこれは、バッファオブジェクトとして簡単に開くことができます。それをに渡しstd::cin.rdbuf()、戻り値を保存します。std::cin次に、ファイルから読み取ります。終了したら、保存した値をに渡して、キーボードに接続されたままの元のファイル記述子rdbufに復元します。stdin

于 2013-03-26T09:14:41.733 に答える
1

問題はにありませんstd::cin。を使用しstd::cin.rdbuf(newBuf)て、入力ソースを切り替えることができます。しかし、あなたの新しい入力ソースは何ですか?ISO C ++は、キーボードについて何も知りません。標準入力については知っていますが、それはすでにここのファイルの内容に設定されています。

OSレベルのキーボードインターフェイスをインターフェイスでラップすることはできますstd::streambufが、それはもちろん移植性がありません。

于 2013-03-26T08:03:01.977 に答える