2016-11-06 60 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加倍輸出,例如,當我稱爲 「任務列表的」 i」的問題我有兩次獲得一些零件。

不要你有人知道哪裏可以成爲問題?

回答

1

函數ReadFile()不讀取空終止的c字符串,而是讀取一個(此處爲8192)個字符的塊,但沒有任何保證具有空終止符。

因此,致電strlen(StdOutBuffer)不保證給出任何有用的結果。您應該寧願依靠dwRead來代替。如果你看的可能不是空終止(該文件中,或者因爲它似乎,通過管道)文本數據,你應該自己添加:

StdOutBuffer[dwLen] = '\0'; 

這個工程即使讀取失敗,因爲第一事情ReadFile()確實將長度設置爲0.請注意,您的緩衝區應具有至少8192 + 1個字符的大小。

爲什麼你會收到錯誤?假設您收到一整行數據,幸運的是,它包含一些空終止符。然後你會處理它。現在假設在下一次迭代中,您只會收到幾個字符(例如只是一個換行符):剩餘的緩衝區不會被覆蓋,並且在新字節結尾處沒有空終止符,strlen()會導致認爲有更多的數據要處理,一些數據將被第二次處理。

+0

非常感謝! –