【问题标题】:'Continuous' C++ output of one executable as Input to another program一个可执行文件的“连续”C++ 输出作为另一个程序的输入
【发布时间】:2016-10-02 22:42:03
【问题描述】:

我正在尝试将一个可执行文件生成的输出作为输入传递给另一个。我已经能够一次发送一行。

问题是当我尝试从 Program1 发送“在 while 循环中生成的行序列”以供 Program2 作为输入读取时。我尝试在终端 (如下所示) 中通过管道传输可执行文件,但它无法正常工作。

./Program1 | ./Program2  
./Program1 |xargs ./Program2  
./Program1 > ./Program2  

我想避免文件 I/O。

注意: 平台:Linux

===================

类似于以下示例的内容

Program1(写入终端)

int main(int argc, char *argv[])
{
    int i = 2200;
    while(1){    
        printf("%d \n", i);
        i++;
    }
}

Program2(从终端读取,Program1 的输出)

int main(int argc, char *argv[])
    {   
        while(1){ 
        // Read 'i' values
        cout << "There are " << argc << " arguments:" << endl;
        // Loop through each argument and print its number and value
        for (int nArg=0; nArg < argc; nArg++)
        cout << nArg << " " << argv[nArg] << endl;
        }

        return 0;
    }

【问题讨论】:

  • 您不能将连续流作为一组参数“传递”给另一个进程,因为必须在进程创建之前知道参数列表
  • 我在从终端读取的第二个程序中什么也看不到。
  • 另外,您使用的最后一个表单只是用./Program1 生成的输出覆盖了./Program2 的内容
  • 当你在 shell 中“管道”两个程序时,第一个程序的标准输出 (stdout) 将被重定向到第二个程序的标准输入 (stdin) 而不是命令行参数。所以在你的情况下你只需要做 ``` int i ; while (true) { cin>> i; cout

标签: c++ command-line-interface piping


【解决方案1】:

问题在于您正试图读取程序参数。但是,当您从一个程序传送到下一个程序时,第一个程序的输出将成为第二个程序的 标准输入 (std::cin)。

在程序 2 中试试这个:

#include <string>
#include <iostream>

int main()
{
    std::string line;

    while(std::getline(std::cin, line)) // read from std::cin
    {
        // show that it arrived
        std::cout << "Line Received: " << line << '\n';
    }
}

【讨论】:

  • 我有一个相当大的命令行计算程序。它将一大堆消息输出到屏幕上。在第二个程序中不需要它们。但是,我需要通过管道将当前正在使用普通 ofstream 磁盘文件写入的数据发送到 Linux 上的另一个程序。我是使用 cout 还是调用 std::rdbuf 来重定向流缓冲区?他们似乎都没有工作?然后在 command 中,我们如何使用管道 (|) 运算符或 >(redirection) 运算符来接收第二个程序中的数据? ./send_prog | ./recv_prog
  • @GreatCentralSun 根据我在您的评论中收集到的信息,您的第一个程序正在写入文件。在这种情况下,如果您将标准输入重定向为在命令行上从该文件中读取,则您的第二个程序可以使用 std::cin 简单地从该文件中读取。 recv_prog &lt; disk_file.
  • 谢谢,我正在查看其代码的人希望将文件写入部分替换为管道输出,recv_prog 可以使用 |操作员。我对命令行编程很生疏,但这应该可以使用 cout 或 FD(文件描述符)吗?不?请赐教。
  • 另外,还有一个问题:是否可以使用 C++(不是 Linux 实用程序)将选定的数据从 send_prog 传送到 recv_prog ?还是从 send_prog 到 cout 的所有输出都将发送到 recv_prog 的 cin
  • @GreatCentralSun 每个程序只是从标准输入或输出读取或写入。这是您在命令行中调用它们的方式,将一个管道连接到另一个管道。如果您想通过管道将输出写入std::cout,如果您想通过管道将输入从std::cin 读取。
最近更新 更多