C ++ Windows管道写文件到变量?

时间:2018-01-19 12:14:37

标签: c++ windows api pipe

我使用msdn的“使用重定向输入和输出创建子进程”教程 链接:https://msdn.microsoft.com/en-us/library/windows/desktop/ms682499(v=vs.85).aspx

一切正常,父进程显示它完全正确。但是不是从管道中读取它并将其写入Parent STD_OUTPUT_HANDLE,而是想从管道中读取并以变量类型写入输出。

这就是我的意思:

void ReadFromPipe(void) 

// Read output from the child process's pipe for STDOUT
// and write to the parent process's pipe for STDOUT. 
// Stop when there is no more data. 
{ 
   DWORD dwRead, dwWritten; 
   CHAR chBuf[BUFSIZE]; 
   BOOL bSuccess = FALSE;
   HANDLE hParentStdOut = GetStdHandle(STD_OUTPUT_HANDLE);

   for (;;) 
   { 
      bSuccess = ReadFile( g_hChildStd_OUT_Rd, chBuf, BUFSIZE, &dwRead, NULL);
      if( ! bSuccess || dwRead == 0 ) break; 

      bSuccess = WriteFile(hParentStdOut, chBuf, 
                       dwRead, &dwWritten, NULL);
      if (! bSuccess ) break; 
   } 
} 

我设法在Writefile函数之后获取chBuf并尝试构建一个字符串,但它包含重复项和字符,我不希望在我的字符串中。所以我的字符串包含比父控制台输出更多的字符。

我的解决方法是将输出保存到文件然后将其流式传输到变量,但该解决方案很糟糕,因为如果您运行我的应用程序的两个实例,我必须管理它以不覆盖其他文件等等越来越复杂,我想要一个更清洁的解决方案

你能帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

  

我设法在Writefile函数之后获取chBuf并尝试构建一个字符串,但它包含重复项和字符,我不希望在我的字符串中。所以我的字符串包含比父控制台输出更多的字符。

最有可能的是,你正在构建你的字符串而忽略dwRead - 也就是说,你总是假设已经读取了完整的缓冲区 - 或类似的东西。尽管如此,从您正在阅读的数据中构建std::string实际上非常简单:

std::string ReadFromPipe(void) { 
    std::string ret;
    DWORD dwRead;
    CHAR chBuf[BUFSIZE]; 
    BOOL bSuccess = FALSE;
    for (;;) { 
        bSuccess = ReadFile( g_hChildStd_OUT_Rd, chBuf, BUFSIZE, &dwRead, NULL);
        if( ! bSuccess || dwRead == 0 ) break; 
        ret.append(chBuf, dwRead);
    }
    return ret;
}