【问题标题】:How do I take the output of one program and use it as the input of another on C++?如何获取一个程序的输出并将其用作 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 个)

标签: c++ input inputstream outputstream


【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2010-10-02
      • 1970-01-01
      • 2010-11-27
      • 2022-01-15
      • 2015-08-31
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 2016-09-27
      相关资源
      最近更新 更多