我发现了许多类似的问题,但没有一个能满足阅读整数的答案。如果我忽略了什么,请原谅我。
我有一个程序可以输出一系列 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] 删除。
我来说两句