一个可执行程序的'C++'输出如何连续地作为另一个程序的输入

5
我正在尝试将一个可执行文件生成的输出作为另一个可执行文件的输入进行传递。我已经成功地一次发送了一行。问题是当我尝试从Program1中发送“在while循环中生成的一系列行”以供Program2读取时。我尝试在终端中使用管道符号(如下所示),但它无法正常工作。
./Program1 | ./Program2  
./Program1 |xargs ./Program2  
./Program1 > ./Program2  

我希望避免文件I/O。
注意: 平台:Linux
==================
以下是示例的一些内容:
程序1(写入终端)
int main(int argc, char *argv[])
{
    int i = 2200;
    while(1){    
        printf("%d \n", i);
        i++;
    }
}

程序2(从终端读取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;
    }

你不能将连续的流作为参数集传递给另一个进程,因为参数列表必须在进程创建之前就已知。 - Serge
我在第二个程序中没有看到任何从终端读取的内容。 - Sam Varshavchik
1
另外,您最后使用的表单将覆盖./Program2的内容,并由./Program1生成输出。 - Serge
5
当你在Shell中"pipe"两个程序时,第一个程序的标准输出(stdout)将被重定向到第二个程序的标准输入(stdin),而不是命令行参数。因此,在您的情况下,您只需要执行以下操作:int i; while (true) { cin >> i; cout << i; } - André Oriani
1个回答

5
问题在于你试图读取程序的参数。但是当你从一个程序管道到下一个程序时,第一个程序的输出成为第二个程序的标准输入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来重定向流缓冲区?但似乎都不起作用?然后,在命令中,我们如何使用管道(|)运算符或>(重定向)运算符在第二个程序中接收数据?./send_prog | ./recv_prog - Cosmic OM...
@GreatCentralSun,从您的评论中我了解到您的第一个程序正在写入文件。在这种情况下,如果您在命令行上将标准输入重定向到该文件,则您的第二个程序可以使用std::cin从该文件读取。 recv_prog < disk_file - Galik
谢谢,我正在查看代码的人希望将文件写入部分替换为使用 | 运算符读取的管道输出,以便由 recv_prog 读取。我对命令行编程有点生疏,但使用 cout 或 FD(文件描述符)应该是可能的,不是吗?请给我指点一下。 - Cosmic OM...
还有一个问题:是否可以使用C++(而不是Linux工具)将选定的数据从send_prog传输到recv_prog?或者所有从send_prog输出到cout的输出都将发送到recv_prog的cin中? - Cosmic OM...
1
@GreatCentralSun 每个程序只是从标准输入或输出读取或写入数据。你可以在命令行中调用它们,将一个程序的输出导入到另一个程序中。如果你想将输出导入到管道中,只需使用 std::cout 进行输出;如果你想将输入导入到管道中,只需使用 std::cin 进行读取。 - Galik
明白了。我也是这么想的,只是想澄清一下。 - Cosmic OM...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接