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

马特·芬隆

我发现了许多类似的问题,但没有一个能满足阅读整数的答案。如果我忽略了什么,请原谅我。

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

左撇子

熟悉标准流是明智之举

简而言之,每个进程默认获得 3 个流:

  • 标准输入(输入,又名std::cin
  • 标准输出(输出,又名std::cout
  • 标准错误(错误,又名std::cerr)。

一般来说,从一个进程到另一个进程的这些流之间的连接是在使用称为管道的东西(即它通过管道将输出传输到输入或输入到输出等)调用进程(通常通过外壳)时完成的,顺便说一句,通常使用“管道”字符表示。

这是一个示例, 我将留下有关 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;
}

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

> Alice | Bob

|命令中的管道符号本质上是说,从 Alice那里获取标准输出,并将其“管道化”到Bob 程序的标准输入

哪个输出...

Bob says Alice says hi!

通常,您不会使用另一个程序来“连接”来自不同进程的流(当然,您可以从“连接”程序中调用 shell,甚至以编程方式执行此操作),而是在程序期间执行此操作调用。

不过,关于您的问题,这里有一个“第三个”程序(称为 Eve)的示例,它基本上位于 Alice 和 Bob 之间,接收来自 Alice 的流,然后输出一个稍微修改的版本,该版本通过管道传输给 Bob收到。

#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 和 Bob 之间使用 Eve,我们按如下方式调用它们......

> 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

输出...(注意这是 Bob 输出值而不是 Alice)。

1 2 3 4 5 6 7 8 9 10

最后我们让 Eve 在传递给 Bob 之前将每个值加 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 发送管道......

> Alice | Eve | Bob

鲍勃输出...

11 12 13 14 15 16 17 18 19 20

希望这可以帮助。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

从文件中仅从一个特定行读取到另一C ++

如何在C++中的字符串中打印从一个索引到另一个索引的一系列字符

如何使用C ++在另一个程序中读取源代码的输出

从C ++中的另一个线程读取指针

如何在另一个C ++程序中运行一个C ++程序?

在C中访问另一个程序的变量

C ++程序输出一系列数字而不是cout

是否可以将 ruby 哈希从一个文件读取到另一个文件中,然后使用其值?

如何将一个数组中的一系列值除以另一个数组中的一系列值

如何从一个文本文件读取然后在一个控制台应用程序中写入另一个文件?

C ++:在程序中创建一个指针,然后在另一个程序中访问该位置

Python读取一系列括号中的第一个括号

将文件内容重定向到C中的另一个程序

将数据写入C中另一个程序的指针吗?

如何将隐藏的输入传递给C#中的另一个程序

将句子中的单词替换为另一个单词的 C 程序

如何从C#中的第一个程序打开另一个程序?

用另一个程序在正在运行的c ++程序中调用一个函数

从另一个应用程序中的文本框中读取文本

根据列中的条件将行从一个Google工作表提取到另一个

从C ++程序在Linux中运行另一个程序

C 从一个文件中读取数据并将计算结果存储在另一个文件中

如何使用bindingSource将数据行所选对象的属性读取到另一个Windows窗体中

C# 中的 JSON 解析 - 将字符串数组提取到另一个数组

在Python中读取另一个程序的控制台输出

如何从另一个程序的标准错误中逐行读取?

为什么可以从另一个程序读取app.config中的加密数据

如何在另一个子程序中读取特定的代码行?

如何将多个JSON数据列表从一个文件读取到Pandas中