2016-08-04 10 views
0

イメージ対話型プロンプトを使用したコンソールプログラム。C++では、cinの流れを制御する方法

ユーザーのコマンドは論理的にセミコロンで分割されます。

ここに簡略化されたコードがあります。

#include <iostream> 
#include <string> 

using namespace std; 

int main() { 
    bool exit = false; 
    string line; 
    string input_str; 

    do { 
    cout << "propmt> " << flush; 

    while (getline(cin, line) && !line.empty()) { 
     if (!input_str.empty()) { 
     input_str += " "; 
     } 
     input_str += line; 

     auto size = input_str.find_first_of(';'); 

     // find a semicolon 
     if (size != string::npos) { 
     /* some code deal with part of string before semicolon */ 
     cout << "\nsample output\nsample output\nsample output\n" << endl; 

     input_str.erase(0, size + 1); 
     if (!input_str.empty()) { 
      cout << "  -> " << flush; 
     } else { 
      cout << "propmt> " << flush; 
     } 
     } 
    } // getline loop 
    } while (!exit); 

    return 0; 
} 

問題は入力がこのような場合です(注:この入力には1つのリターンキーのみ)。

ユーザーは、コマンドラインにコピーして貼り付け、手動で入力しないでください。

AAAAAAAAAAAAA; BBBBBBBBBB 
BBBBBBBBBBBBB; 

私のプログラムの出力は次のようになります。

propmt> AAAAAAAAAAAAA; BBBBBBBBBB 
BBBBBBBBBBBBB; 
sample output 
sample output 
sample output 

    -> 

しかし、私はこの部分BBBBBBBBBBBBB;は私のサンプル出力の後にあったたいと思います。

それはこのようにする必要があります:

propmt> AAAAAAAAAAAAA; BBBBBBBBBB 
sample output 
sample output 
sample output 

    -> BBBBBBBBBBBBB; 

、ユーザー入力が別のキーを入力したときに、その後、プログラムは全体Bコマンドに対処し、その結果を示すことができました。

+3

これは、cursesのようなライブラリでより直接的に制御したい場合を除き、コンソールのエコー機能の一部です。 – aschepler

答えて

2

これはなぜ発生するのか誤解しています。データからcinに、coutに流れません。ファイルを標準入力または標準出力にリダイレクトしてプログラムを実行すると、これを明確に見ることができます。

代わりに、ユーザー入力の表示がターミナル(または何でも)が提供する機能であり、あなたのプログラムがで実行されている。C++標準ライブラリには、この動作—を制御するための機能を提供していないあなたの代わりに第三を使用する必要がありますユーザーの入力をエコーし​​ないように端末に指示するために、パーティライブラリ(例えば、ncurses、またはWindowsが使用するもの)を使用します。

+0

Linuxでこの動作を制御できるシステムコールはありますか? – Christophe

+0

@Christophe:いいえ。 ncursesは、AFAIKであり、Linuxの端末を操作する標準的な方法です。 – Hurkyl

関連する問題