C ++ ReadFile,CreateProcess,Pipe Stdout重定向,加倍输出

时间:2016-11-06 21:17:48

标签: c++ stdout readfile

我有这段代码:

        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输出加倍有问题,例如,当我调用“tasklist”时,我有两次部分输出。

不是有人知道哪里可能有问题?

1 个答案:

答案 0 :(得分:1)

函数ReadFile()不会读取空终止的c-string,而是一个(此处为8192)个字符块,而不保证具有空终止符。

因此,无法保证调用strlen(StdOutBuffer)可以提供任何有用的结果。您应该更依赖dwRead。如果您读取的文本数据可能不是以null结尾(在文件中,或者看起来像是通过管道),您应该自己添加它:

 StdOutBuffer[dwLen] = '\0'; 

即使读取失败,这仍然有效,因为ReadFile()的第一件事就是将长度设置为0.请注意,缓冲区的大小应至少为8192 + 1个字符。

为什么会出现错误? 假设您收到一整行数据,幸运的是,它包含一些空终结符。然后,您将对其进行处理。现在假设在下一次迭代中你只收到几个字符(例如只是换行符):缓冲区的剩余部分不会被覆盖,并且因为你没有在结束时使用空终止符。新的字节读取,strlen()会导致认为有更多的数据需要处理;一些数据将被第二次处理。