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

发布于 2024-11-08 18:21:46 字数 152 浏览 4 评论 0原文

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

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

I have a program that takes the counts of experiments as command string argument and outputs the sequence of floating numbers.
Example:
im_7.exe 10
10.41
13.33
8.806
14.95
15.55
13.88
10.13
12.22
9.09
10.45

So, i need to call this program in my program and analyze this sequence of numbers.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

彼岸花ソ最美的依靠 2024-11-15 18:21:46

如果您使用的是 Windows,则需要

  1. 使用 Windows 的 CreatePipe api 执行以下操作创建 Pipe1。使用此管道从子进程的 STDOUT 读取数据。
  2. 以相同的方式创建 Pipe2 并使用该管道将数据写入子进程的 STDIN。
  3. 创建子进程并在启动信息中提供这些句柄并从父进程继承句柄。还传递命令行参数。
  4. 关闭Pipe1的写端和Pipe2的读端。
  5. 在您的情况下,您没有在子进程输入中写入任何内容。您可以通过从 Pipe1 读取来直接读取子进程输出的数据。

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

希望这就是您正在寻找的内容。

If your are on windows then you need to do the following

  1. Create a Pipe1 using CreatePipe api of windows. Use this pipe for reading data from STDOUT of the child process.
  2. Create a Pipe2 the same way and use that pipe for writing data to the STDIN of the child process.
  3. Create the child process and in the startup info provide these handles and inherit the handles from the parent process. Also pass the cmd line arguments.
  4. Close the write end of Pipe1 and read end of Pipe2.
  5. In your case you are not writing anything into the child process input. You can straight away read the data from the child process output by reading from the Pipe1.

For a sample have a look at the following link. http://msdn.microsoft.com/en-us/library/ms682499%28VS.85%29.aspx

Hope this is what you are looking for.

猫弦 2024-11-15 18:21:46

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

Data that one program prints to standard output (std::cout in C++) can be piped to the standard input (std::cin) of another program. The specifics of how the two programs are connected depends on the environment (specifically operating system and shell).

夜夜流光相皎洁 2024-11-15 18:21:46

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

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

You can create a class that holds your data (with >> and << overloads)

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;
};

And then you can call it like so

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

}

On Linux the test pipe can be formed like so:

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

Not sure how to do pipes on Windows though...

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文