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

时间:2011-05-19 12:32:52

标签: c++ input inputstream outputstream

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

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

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:4)

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

  1. 使用Windows的CreatePipe api创建Pipe1。使用此管道从子进程的STDOUT读取数据。
  2. 以相同的方式创建Pipe2并使用该管道将数据写入子进程的STDIN。
  3. 创建子进程,并在启动信息中提供这些句柄并继承父进程的句柄。还传递cmd行参数。
  4. 关闭Pipe1的写入端并读取Pipe2的结尾。
  5. 在您的情况下,您没有在子进程输入中写入任何内容。您可以通过读取Pipe1直接读取子进程输出中的数据。
  6. 对于样本,请查看以下链接。 http://msdn.microsoft.com/en-us/library/ms682499%28VS.85%29.aspx

    希望这就是你要找的东西。

答案 2 :(得分:3)

您可以创建一个包含数据的类(>><<重载)

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上进行管道...