2016-11-06 87 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

非常感谢! –