【问题标题】:Passing program one output as input for program two将程序一的输出作为程序二的输入传递
【发布时间】:2014-09-27 23:19:06
【问题描述】:

我正在寻找一种将程序一的输出传递给程序二的输入的方法。我创建了两个非常简单的程序来尝试了解如何执行此操作,但我遇到了问题。

程序一:

#include <iostream>
int main()
{
    using namespace std;
    std::cout << "Hello World!";
    return 0;
}

ProgramTwo(打印所有参数):

#include <iostream>

int main(int argc, char *argv[])
{
    using namespace std;

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

我已经尝试使用管道命令来传递输出:

./one | ./two

但我的第二个程序只打印一个参数:

There are 1 arguments:
0 ./two

我也试过以下命令:

/one > ./two

但这会导致两个程序都没有输出。

我哪里错了?

【问题讨论】:

  • 标准输入不通过参数传递,使用cin(类似于cout)。顺便说一句,/one &gt; ./two 只是将“一”输出覆盖到“二”文件中(不再可执行)。

标签: c++ linux input output communication


【解决方案1】:

您将一个程序的输出传递给另一个程序的方式是正确的:

./one | ./two

但是,您似乎不想这样做,并且希望将一个程序的所有输出作为另一个程序的命令行参数传递。

有多种方法可以做到这一点,但其中之一是:

./two `./one`

(注意反引号!)

如果您想将其作为单个参数传递,请尝试:

./two "`./one`"

【讨论】:

  • 效果很好,非常感谢!时限到期后我会接受。
  • 作为一个 FYI,有一个替代的 $(command) 语法可以用来调用子命令。美元符号语法稍微好一点,因为您不必担心 $() 转义,这与嵌套时的刻度 `` 标记不同。
【解决方案2】:

你很亲密。您可以使用xargs 工具将标准输出转换为一系列参数,以调用后续程序。因此,例如,您可以这样做:

 ./one | xargs ./two

这有望打印出“Hello world”作为程序二的参数。

【讨论】:

  • 感谢您的回答,唯一的问题是它将hello 和一个参数和world 作为单独的参数打印。
  • xargs 命令支持“--delimiter”参数,允许您指定除空格以外的分隔符(例如换行符)。
猜你喜欢
  • 2019-02-28
  • 1970-01-01
  • 2015-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-02
  • 1970-01-01
相关资源
最近更新 更多