2016-11-06 3 views
0

を倍増:私は、「タスクリスト」を呼び出すときC++のReadFile、CreateProcessを、パイプ標準出力のリダイレクトは、私は、コードのこの作品持つ出力

 for (;;) { 
      BOOL ReadSuccess = ReadFile(rdPipe, StdOutBuffer, 8192, &dwRead, NULL); 

      if (strlen(StdOutBuffer) <= 0) { 
       Sleep(100); 
       send(sock, RECIEVE_BREAK, strlen(RECIEVE_BREAK), 0); 
       break; 
      } 

      else if (!ReadSuccess || dwRead == 0) { 
       Sleep(100); 
       send(sock, RECIEVE_BREAK, strlen(RECIEVE_BREAK), 0); 
       break; 
      } 

      else { 
       send(sock, StdOutBuffer, strlen(StdOutBuffer), 0); 
      } 

      cout << StdOutBuffer << endl; 
      cout << "\n\n\n\n"; 
     } 

を、私は私のStdOutBufferで倍増した出力に問題があり、例えば、私は」いくつかの部分を2回持っています。

どこに問題があるのでしょうか?

答えて

1

関数ReadFile()はヌルで終了するC文字列を読み取るのではなく、ヌルターミネータを持つことを保証していないブロック(ここでは8192個)です。

したがって、strlen(StdOutBuffer)を呼び出すと、有用な結果が得られるとは限りません。代わりにdwReadに頼るべきです。あなたは(パイプを経由して、それはそうと、ファイルまたは)終端ヌルではないかもしれないテキストデータを読めば、あなたはそれを自分で追加する必要があります:最初ので

StdOutBuffer[dwLen] = '\0'; 

をこれは、読み取りが失敗しても動作します事ReadFile()は、長さを0に設定します。バッファのサイズは少なくとも8192 + 1 charにする必要があります。

なぜエラーが発生しますか?フルラインのデータを受信したとします。幸いにも、それにはヌルターミネータが含まれています。あなたはそれを処理します。次の反復では、2つの文字(たとえば改行のみ)を受け取ることになります。残りのバッファは上書きされず、新しいバイトの終わりにヌルターミネータがないので、strlen()は、そこにあるより多くのデータが処理されていると思うでしょう。一部のデータは2回目に処理されます。

+0

ありがとうございました! –

関連する問題