2017-07-13 3 views
0

プログラムをテストしている間、処理のために文字列をstdinに送ることができればいいです(VSCode 1.15.0-insider/Linux Mint 18.2のlibval​​a-0.36)。以下は説明のためのものですが、stdin.puts/stdin.flushは機能していないようです。キーストローク/ストリングをスタンダードにポンピングするにはどうすればよいですか?stdinに文字列/コマンドを送る方法

private void test_func(){ 
    ...do stuff 
    stdin.puts("""{"event":"server.connected","params":{"version":"0.0.1","pid":0}}"""); 
    ...do stuff 
    stdin.puts("exit\r\n"); 
} 
public static int main (string[] args) { 
    string line; 
    ...do stuff 

#if DEBUG 
    test_func(); 
#endif 

    while ((line = stdin.read_line()) != null) { 
     line = line.strip(); 
     if (line.length > 0) { 
      if (line == "exit") break; 
      gJsonRPC.handle_request (line); 
      } 
     } 
    ...do stuff 
    } 

更新: はとても一時的にこの方法に落ち着いた、GLibの中でネットに似た機能 "のSendKeys" クラスを見つけることができます....

public static void SendKeys(string sKeys) { 
    //-------------------------------------------------------------- 
    //OSS:Hack:SendKeys 
    //-------------------------------------------------------------- 
    char[] _keys = sKeys.to_utf8(); 
    for (int i = _keys.length; i >= 0; i--) 
     stdin.ungetc (_keys[i]); 
    //-------------------------------------------------------------- 
    } 

@LasallはFileStream.open(¨を提案/ dev /stdin¨、¨w¨)ので、次に試してみます。

答えて

2

GLib.stdinは実際にはGLib.FileStreamです。

あなたはこのようなのFileStreamを取る関数であなたの処理コードをカプセル化することができます

public void my_processing_func (FileStream stream) { 
    while ((line = stream.read_line()) != null) { 
     line = line.strip(); 
     if (line.length > 0) { 
     if (line == "exit") break; 
     gJsonRPC.handle_request (line); 
     } 
     } 
    } 
} 

次に、あなたの主にあなたが条件付きでテストデータまたは標準入力のどちらかを使用することができます。

#ifdef DEBUG 
    var stream = test_func(); 
#else 
    var stream = stdin; 
#endif 
    my_processing_func (stream); 

私はおそらくDEBUGを使用せず、TEST_DATAのようなよりわかりやすい名前を使用します。また、適切な単体テストを使用し、メインプログラムの代わりにテストプログラムを書く方が良いでしょう。

+0

ありがとう、ジェンス、私はすでに別々の単体テストを持っています。上のコードは、単にstdinの問題のSOの図を提供することでした。どのように私はstdinに文字列をポンプすることができます任意のアイデア?上記の私のstdin.putsは動作していないようです。 –

+0

@ George:stdinは読み取り専用です。 FileStream.open(¨/ dev /stdin¨、¨w¨)を使用して、stdoutに直接書き込むことも、手動で開くこともできます。ただし、read_lineで読み取るまでは、変更内容がバッファに格納されない可能性があるため、同期の問題が発生します。 – Lasall

+0

私は最初の場所で試してみませんが、stdinが本当に標準入力であるかどうかわからないワームの缶が開きます。代わりにあなたのメソッドをメインプログラムとは別にテストするか、プログラムに "偽の"入力を実際に実行する必要がある場合は、 './myprog

関連する問題