2011-07-01 11 views
5

JavaからCプログラムを呼び出して標準出力を取得しようとしています。ここに私のコードは次のとおりです。ここでgetchar()でCプログラムからJavaの標準出力を取得する際に問題が発生する

try { 
    ProcessBuilder pb = new ProcessBuilder("helloworld.exe"); 
    pb.redirectErrorStream(true); // Merge std out and std err into same stream 
    program = pb.start();   // Start program 

    BufferedReader input = new BufferedReader(new InputStreamReader(program.getInputStream())); 

    line = input.readLine(); 
    while (line != null) { 
     System.out.println(line); 
     line = input.readLine(); 
    } 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

は、サンプルのCプログラムです:

int main(){ 
    printf("Hello world\n"); 
} 

私は(この場合のhelloworld)を実行していたプログラムはそれでgetchar()を持っていない時にこれが正常に動作します。しかし、printfの直後にgetchar()を追加すると、入力ストリームから何も得られません。なぜどんなアイデア?カイルとして

おかげ

+1

はしばらくの間cで動作しませんでしたが、印刷後に出力ストリームをフラッシュしようとする場合があります – Kyle

+0

cプログラムを単独で実行してエラーが発生しているかどうか、 –

+0

なぜ入力を必要としないプログラムに 'getchar'を追加しますか? ??? – pmg

答えて

1

あなたは文字が実際に遅れることなく、標準出力に行くことを確認するために、印刷を呼び出した後に出力ストリームをフラッシュする必要があるかもしれない、と述べました。両方のプログラムでこれを行う必要があります。これはCでfflush(stdout);で行うことができ、おそらくSystem.out.flush()のようなものでJavaで行うことができます。どうやら子プロセス(あるいはOSやJavaランタイムや...、...)は、まだ親プロセスに出力を送信する前に、CHAR(getchar)を待っている

--David

+0

Cプログラムのprintfの直後にfflush(NULL)を追加して問題を解決しました。カイルとデイビッドに感謝します。 – Dan

0

入力が不要な場合は、getcharを含めないでください。

1

Cプログラムがgetcharを呼び出すと、Cプログラムは入力を待つために停止します。そして入力は決して来ない!結局のところ、あなたのJavaプログラムはstdout/stderrをキャプチャしますが、stdinへのアタッチについては何もしません。

programオブジェクトのgetOutputStream() instance method in the Process classを使用して、getInputStream()と同様にstdinを表すストリームを取得します。

次に、Cプログラムが期待するCプログラムにデータを送信します。

関連する問題