我发现了许多类似的问题,但是没有一个答案能满足阅读要求。如果我忽略了某些内容,请原谅我。
我有一个程序,将一系列100个以空格分隔的整数输出到cout。我有另一个程序,从cin读取整数。我的目标是创建第三个程序,该程序接受2个参数,程序1和程序2,并将两者连接,这意味着从程序1输出的整数用作程序2的输入。但是,我知道popen和pstreams,他们似乎处理弦乐。我想避免文件io。最好的方法是什么?
熟悉standard streams是明智的。
总之,每个进程默认都会获得3个流:
std::cin
)std::cout
)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
希望这会有所帮助。