如何获取一个程序的输出并将其用作 C++ 上另一个程序的输入?

Posted

技术标签:

【中文标题】如何获取一个程序的输出并将其用作 C++ 上另一个程序的输入?【英文标题】:How do I take the output of one program and use it as the input of another on C++? 【发布时间】:2011-08-28 20:32:23 【问题描述】:

我有一个程序,它将实验计数作为命令字符串参数并输出浮点数序列。 例子: im_7.exe 10 10.41 13.33 8.806 14.95 15.55 13.88 10.13 12.22 9.09 10.45

所以,我需要在我的程序中调用这个程序并分析这个数字序列。

【问题讨论】:

您需要某种 IPC:管道、共享内存或套接字。 您可能需要编辑标签,以便出现“windows”和“pipe”(您必须删除一两个,因为您只能有 5 个) 【参考方案1】:

如果您在 Windows 上,那么您需要执行以下操作

    使用 Windows 的 CreatePipe api 创建 Pipe1。使用此管道从子进程的 STDOUT 读取数据。 以同样的方式创建一个 Pipe2 并使用该管道将数据写入子进程的 STDIN。 创建子进程并在启动信息中提供这些句柄并从父进程继承句柄。同时传递 cmd 行参数。 关闭 Pipe1 的写入端和 Pipe2 的读取端。 在您的情况下,您没有在子进程输入中写入任何内容。您可以通过从 Pipe1 读取直接从子进程输出中读取数据。

有关示例,请查看以下链接。 http://msdn.microsoft.com/en-us/library/ms682499%28VS.85%29.aspx

希望这是您正在寻找的。​​p>

【讨论】:

【参考方案2】:

您可以创建一个保存数据的类(使用 >><< 重载)

include <iostream>
#include <iterator>
#include <vector>
class MyData

public:
  friend 
  std::istream& 
  operator>>(std::istream& in, MyData& data)
   
    in >> data.size ;
    data.m_data.resize(data.size);
    std::copy( 
          std::istream_iterator<float>(in), 
          std::istream_iterator<float>( ),
          data.m_data.begin()
           );
  
  friend
  std::ostream&
  operator<<(std::ostream& out, MyData& data)
   
    out<<  data.size << " ";
    for(size_t i=0;i<data.size;++i)
      out<< data.m_data[i] <<" ";
    
    return out;
  
private:
  int size;
  std::vector<float> m_data;
;

然后你可以这样称呼它

int
main  (int ac, char **av)

  MyData d;
  std::cin>>d; //input one set of data;

  //test
  std::cout<<d;

  //get multiple data files
  std::vector<MyData> buffer;

   std::copy( 
            std::istream_iterator<MyData>(std::cin), 
            std::istream_iterator<MyData>( ),
        std::back_inserter(buffer)); // copies all data into buffer


在 Linux 上,测试管道可以这样形成:

echo "4 1.1 2.2 3.3 4.4" | ./a.out

不知道如何在 Windows 上做管道...

【讨论】:

这似乎与问题无关。 @Sam - 我稍微误读了这个问题,我已经改进了我的答案。 我认为这个问题更多的是关于 IPC。【参考方案3】:

一个程序打印到标准输出(C++ 中的std::cout)的数据可以通过管道传输到另一个程序的标准输入(std::cin)。两个程序如何连接的细节取决于环境(特别是操作系统和 shell)。

【讨论】:

以上是关于如何获取一个程序的输出并将其用作 C++ 上另一个程序的输入?的主要内容,如果未能解决你的问题,请参考以下文章

离子存储获取返回一个承诺“Bearer [object Promise]”如何返回一个值并将其用作授权令牌?

如何重定向 python 解释器输出并将其捕获到 C++ 程序中的字符串中?

如何选择来自脚本输出的参数并将其传递给 Bamboo 中的下一个脚本或作业?

如何从查询中捕获值并将其用作另一个查询中的值

如何在 C++ 中创建 Lua 表,并将其传递给 Lua 函数?

datetimepicker bootstrap 获取值并将其用作输入未定义的错误