【问题标题】:C++ ReadFile, CreateProcess, Pipe Stdout redirection, doubled OutputC++ ReadFile、CreateProcess、管道标准输出重定向、双输出
【发布时间】:2016-11-06 21:17:48
【问题描述】:

我有这段代码:

        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 中的输出加倍有问题,例如,当我调用“任务列表”时,我有一些部分两次。

你不知道哪里有问题吗?

【问题讨论】:

    标签: c++ stdout readfile


    【解决方案1】:

    函数ReadFile() 不会读取以空字符结尾的 c 字符串,而是读取一个(此处为 8192)字符块,但不能保证具有空字符终止符。

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

     StdOutBuffer[dwLen] = '\0'; 
    

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

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

    【讨论】:

      猜你喜欢
      • 2016-04-26
      • 1970-01-01
      • 2013-02-10
      • 1970-01-01
      • 2012-05-28
      • 2017-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多