如何获取一个程序的输出并将其用作 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 中的下一个脚本或作业?