2009-05-19 27 views
0

私のプログラムの出力を複数回読みたい。いくつかのことは、私はXを渡す場合、私は出力を取得し、私はそれを表示し、再び私はYを渡す場合、私は出力を取得し、私はそれを表示します。プロセスを再起動する必要はありません。 は私が作った交流プログラム同じストリームから複数回Cを読み込む#

#include<stdio.h> 
int main() 
{ 
    int i; 
    int j; 
while(scanf("%d", &i)) 
{ 
    for(j = 0; j<=i;j++) 
    printf("%d\n",j); 
} 
return 0; 
} 

それを試して、今私はそれがプログラムにリダイレクトstandardinput(のStreamWriter)とを通過するテキストボックスにテキストを入力するのC#、とそれをinterfactingよ出力を読むには、標準出力(ストリームリーダー).readtoend()を呼び出します。

しかし、それは私のために働いていません。ストリームが終了するまで何か指示が読み上げられるまで待ち状態に入る。

どうすればこのようなことができますか?

私はbeginoutputreadメソッドを呼び出す場所でも非同期読み込みを試みましたが、読み込みが完了した時点を私は知らないでしょう!私のオリジナルプログラムにマーカーを追加して、現在の入力が終了したことを示す方法があります。私がそれを達成するための他の方法はありますか?

+0

最後の2つの点はかなり矛盾しているようです。読書が終わるのを待っていますか? – Noldorin

答えて

5

ストリームがシークをサポートした場合(CanSeek)、あなたはそれは、このようにすべての上に再びそれを読むために始め

stream.Position = 0; 

を設定することで、「巻き戻し」することができます。

+0

ストリームはシークをサポートしていません。 –

0

クックとダーティー:これは、いくつかの小さな不具合で動作します。私はオフィスを残しているので、それを改善してみてください:)

 ProcessStartInfo psi = new ProcessStartInfo(@"c:\temp\testC.exe"); 
     psi.CreateNoWindow = true; 
     psi.RedirectStandardError = true; 
     psi.RedirectStandardInput = true; 
     psi.RedirectStandardOutput = true; 
     psi.UseShellExecute = false; 

     Process p = Process.Start(psi); 
     string input = ""; 

     ConsoleColor fc = Console.ForegroundColor; 

     StreamWriter sw = p.StandardInput; 
     StreamReader sr = p.StandardOutput; 

     char[] buffer = new char[1024]; 
     int l = 0; 

     do 
     { 
      Console.Write("Enter input: "); 
      input = Console.ReadLine(); 

      int i = Convert.ToInt32(input); 

      sw.Write(i); 
      sw.Write(sw.NewLine); 

      Console.ForegroundColor = ConsoleColor.Yellow; 

      Console.Write(">> "); 

      l = sr.Read(buffer, 0, buffer.Length); 

      for (int n = 0; n < l; n++) 
       Console.Write(buffer[n] + " "); 

      Console.WriteLine(); 

      Console.ForegroundColor = fc; 
     } while (input != "10"); 

     Console.WriteLine("Excution Finished. Press Enter to close."); 
     Console.ReadLine(); 
     p.Close(); 

PS: - 私はVS2008でコンソールexeファイルを作成したとCにコピー:\ tempフォルダを名前testC.exe下。

2

ストリームがシークをサポートしていないが、ストリーム内のデータがそれほど大きくない場合、そのストリームを読み書きしてMemoryStreamに書き込むことができます。

関連する問題