C ++管道用多个程序修改输入文件

时间:2018-02-14 13:25:11

标签: c++ pipe

我已经做了这个任务+3周了,我确信这对那里的人来说是件小事,所以我只想问一下是否有人可以给我写一些带有这些要求的示例代码:

  1. 任务在 C ++ ,主要是熟悉管道
  2. 应该从cmd:cat inputfile.cpp | ./program01 ./program02这样调用(我认为)。我想说的是(我认为):“使用程序program01和program02”对文件inputfile.cpp进行修改
  3. 使用管道,首先program01删除inputfile.cpp中所有出现的内容(例如所有空行)。删除所有空行后,program02应删除所有其他内容(例如注释)。
  4. 我的问题有意义吗?我的意思是,管道是否意味着以这种方式使用(首先运行其他程序然后另一个程序)?

    我是否可以通过多个程序运行多个文件,例如cat input1.cpp input2.cpp input3.cpp | ./program01 ./program02 ./program03

    我已经编写了一堆程序,可以对文件执行各种操作,但这不是任务的主要内容。主要的是“管道”部分,但我真的,真的只是没有得到它。

    感谢任何指导(下面的一些代码)。

    #include <stdio.h>
    #include <sys/types.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <string.h>
    
    #include "programs.h"
    
    int main(int argc, char** argv)
    {
        int fd[2];
        pid_t pid;
        int result;
    
        result = pipe(fd);
        if(result < 0)
        {
            perror("pipe error");
            exit(1);
        }
    
        pid = fork();
        if(pid < 0)
        {
            perror("fork error");
            exit(2);
        }
    
        // Child
        if(pid == 0)
        {
            while(1)
            {
                // I guess I should do some piping-magic here?
            }
            exit(0);
        }
        // Parent
        else
        {
            while(1)
            {
    
            }
            exit(0);
        }
    }
    

2 个答案:

答案 0 :(得分:2)

我认为您将bash pipe命令与管道混淆以获取IPC。 在bash中,管道不传递参数,但是将命令的stdout重定向到stdin的下一个命令。所以在你的c ++程序中,你应该从stdin读取并写入stdout(relevant stackoverflow question)。 你可以做点什么

cat file | ./program1 > file

连锁节目

cat file | ./program1 | ./program2 > file

答案 1 :(得分:2)

要处理来自shell管道的数据,您只需读取std::cin中的数据并将结果输出到std::cout。 shell管理实际的管道。

这是一个什么都不做的程序。它简单地将数据从传入的“管道”传递到传出的“管道”:

使用“管道”不做任何事情:

#include <iostream>

int main()
{
    char c;
    while(std::cin.get(c))
        std::cout.put(c);
}

删除每个空白行的程序:

#include <iostream>
#include <string>

int main()
{
    std::string line;
    while(std::getline(std::cin, line))
    {
        if(line.empty()) // skip empty lines
            continue;

        // otherwise send them out    
        std::cout << line << '\n';
    }
}