将整数从一个程序的cout读取到C ++中另一个程序的cin

问题描述 投票:0回答:1

我发现了许多类似的问题,但是没有一个答案能满足阅读要求。如果我忽略了某些内容,请原谅我。

我有一个程序,将一系列100个以空格分隔的整数输出到cout。我有另一个程序,从cin读取整数。我的目标是创建第三个程序,该程序接受2个参数,程序1和程序2,并将两者连接,这意味着从程序1输出的整数用作程序2的输入。但是,我知道popen和pstreams,他们似乎处理弦乐。我想避免文件io。最好的方法是什么?

c++
1个回答
2
投票

熟悉standard streams是明智的。

总之,每个进程默认都会获得3个流:

  • stdin(输入,也称为std::cin
  • stdout(输出,又名std::cout
  • stderr(错误,又名std::cerr)。

通常来说,当使用称为管道的东西(通常是通过外壳)调用流程(即,将输出通过管道输入到输入,或通过输入到输出等)来调用从一个流程到另一个流程的流之间的连接时,顺便说一句,通常使用'pipe'字符表示。

这里是一个示例,我将留下约100个以空格分隔的整数的详细信息,供您实现,这仅显示了流的原理以及不同的程序如何在原位使用它们。

首先,我们定义一个名为Alice的程序,该程序输出一个简单的短语...

#include <iostream>

int main(int argc, char** argv)
{
    std::cout << "Alice says hi!";
    return 0;
}

从命令行运行...

> Alice

我们得到...

Alice says hi!

然后我们定义一个名为Bob的程序,该程序将输出一个短语以及从stdin接收到的短语。

#include <iostream>
#include <string>

int main(int argc, char** argv)
{
    std::string theInput, line;

    while (std::getline(std::cin, line))
        theInput.append(line);

    std::cout << "Bob says " << theInput;

    return 0;
}

关键是如何从外壳程序调用这些程序。

> Alice | Bob

命令中的管道符号|本质上是说,从Alice中提取stdout,并将其“管道”到Bob程序的stdin

哪个输出...

Bob says Alice says hi!

通常,您不使用其他程序来“连接”来自不同进程的流(尽管您当然可以在“连接”程序中调用外壳程序,甚至可以以编程方式进行操作),而是在程序执行此操作( s)调用。

不过,关于您的问题,这里有一个“第三”程序(称为夏娃)的示例,该程序实际上位于爱丽丝和鲍勃之间,从爱丽丝那里接收数据流,然后输出经过稍微修改的版本,该版本通过管道传输到鲍勃接受。

#include <iostream>
#include <string>

int main(int argc, char** argv)
{
    std::string theInput, line;

    while (std::getline(std::cin, line))
        theInput.append(line);

    std::cout << "Eve woz 'ere " << theInput;

    return 0;
}

使用爱丽丝和鲍勃之间的夏娃,我们按如下方式调用它们...

> Alice | Eve | Bob

您可以看到输出是...

Bob says Eve woz 'ere Alice says Hi!

提到的另一个流(stderr)用于输出错误,并且以与stdout类似的方式工作,但是意味着程序可以将输出错误与正常输出区分开。

编辑:

我已经修改了示例,以显示如何在周围传递整数...

Alice输出值1到10。

#include <iostream>
#include <string>

int main(int argc, char** argv)
{
    std::cout << "1 2 3 4 5 6 7 8 9 10";
    return 0;
}

正在调用爱丽丝...

> Alice

输出...

1 2 3 4 5 6 7 8 9 10

Bob然后从stdin接收由空格分隔的整数值的字符串。

#include <iostream>
#include <string>
#include <vector>
#include <sstream>

int main(int argc, char** argv)
{
    std::string input, line;
    std::vector<int> values;

    while (std::getline(std::cin, line))
        input.append(line);

    std::istringstream iss(input);
    while (iss >> line)
        values.push_back(std::stoi(line));

    for (int i = 0; i < values.size(); ++i)
        std::cout << values[i] << " ";

    return 0;
}

管道传输到Bob时调用Alice ...

> Alice | Bob

输出...(请注意,这是鲍勃输出值而不是爱丽丝)。

1 2 3 4 5 6 7 8 9 10

最后我们有了夏娃,他在将每个值加10之前传递给了鲍勃。

#include <iostream>
#include <string>
#include <vector>
#include <sstream>

int main(int argc, char** argv)
{
    std::string input, line;
    std::vector<int> values;

    while (std::getline(std::cin, line))
        input.append(line);

    std::istringstream iss(input);
    while (iss >> line)
        values.push_back(std::stoi(line) + 10);

    for (int i = 0; i < values.size(); ++i)
        std::cout << values[i] << " ";

    return 0;
}

调用爱丽丝,通过夏娃通过管道传送给鲍勃...

> Alice | Eve | Bob

鲍勃输出...

11 12 13 14 15 16 17 18 19 20

希望这会有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.