将C ++程序的输出导向另一个程序

4

main.cpp 接受2个命令行参数,打开名为“exampleTest.txt”的文件并向该文件写入内容。

#include <iostream>
#include <fstream>
using namespace std;
int main(int argc, char const *argv[])
{
    ofstream op;
    op.open("exampleTest.txt",ios::out);
    op<<argv[1]<<"\n"<<argv[2]<<endl;
    op.close();
    return 0;
}

pgm1.cpp 打开名为 "exampleTest.txt" 的文件,并显示该文件的内容。

#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main(int argc, char const *argv[])
{
    string line;
    ifstream fs;
    fs.open("exampleTest.txt",ios::in);

    if (fs.is_open())
    {
        while(getline(fs,line))
        {
            cout<<line<<endl;

        }
    }
    fs.close();

    return 0;
}

将这两个程序编译并分别运行是完全没有问题的。然而,我想将 main.cpp 的输出导入到程序 pgm1.cpp 中。

我尝试过:

g++ main.cpp -o main
g++ pgm1.cpp -o pgm
./pgm |./main abc def

What i expect the output to be:

abc 
def

What i am getting:

<no output>

我的理解: 'main'创建了文件'exampleTest.txt',并将abc def作为输入添加到该文件中。当该文件被传递给'pgm'(通过管道),它应该能够读取文件的内容并输出。

abc
def

在终端中,我没有得到任何输出。(如果我分别运行每个文件,则可以正常工作)
请问我错过了什么?


2
你真的需要先了解管道的基础知识,而不是在这里提问。 - 4ae1e1
使用xargs会删除问题! - user1436187
2个回答

3
$./main aaa cccc ;./pgm
aaa
cccc

由于您正在将主程序的输出写入文件并在pgm1.cpp文件中使用文件名(硬编码),使用管道重定向不会有帮助,因为管道通常将标准输入作为输入。

对程序进行轻微修改可以演示这一点(其中一种方法):

main.cpp

#include <iostream>
#include <fstream>
using namespace std;
int main(int argc, char const *argv[])
{
    ofstream op;
    op.open("exampleTest.txt",ios::out);
    op<<argv[1]<<"\n"<<argv[2]<<endl;
    op.close();
    cout << "exampleTest.txt";
    return 0;
}

pgm1.cpp

#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main(int argc, char const *argv[])
{
    string line;
    ifstream fs;
    fs.open(argv[1],ios::in);

    if (fs.is_open())
    {
        while(getline(fs,line))
        {
            cout<<line<<endl;

        }
    }
    fs.close();

    return 0;
}

输出:

  $ ./main ddd eee | xargs ./pgm
    ddd
    eee

是的,我打算将这个作为答案更新。我需要一个顺序执行命令的方式,即一个接一个地执行,而不是将一个程序的输出传递给另一个程序。谢谢。 - SeasonalShot
有趣。在使用C和C++ 25年后,我才发现可以使用C++的cout流运算符发送文件(exampleText.txt)的内容,例如:cout << "exampleTest.txt" ;并将其导入到另一个程序的std::cin中!真是令人着迷! - Cosmic OM...

2
您正在将输出写入文件,然后读取它们,但是管道(通常)通过将一个程序的输出放到stdout上,并使用其作为另一个程序stdin输入来工作。
对于您来说,最简单的解决方案可能是让main.cpp在完成后将输出文件名写入stdout。
编辑
另一种选择是让main.cpp将行写入stdout以及文件,然后让pgm1.cpp从stdin而不是文件中读取这些行。根据您的其他要求,这可能是更好的解决方案,也可能不是。

@G Fetterman:是否有可能将Ofstream(磁盘文件)写入代码重新路由到另一个程序(在Linux上)通过管道发送它们。因此,可以将输出重定向到另一个程序,而不是使用ofstream file声明的文件<<“数据行”(其中file是声明的)。是否可以从C++中并使用Linux上的PIPE(|)运算符将该输出重定向到另一个程序,如下所示: ./send_prog | ./recv_prog - Cosmic OM...

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