我有一个用c ++编写的程序。我正在寻找如何通过另一个c ++程序实时捕获其值的方法。 例如,我在程序中有如下内容:
[[file]]
这很简单,但是代表了我的真实程序如何工作,每隔几毫秒就会为int main()
{
int n = 0;
while (true) {
cout << n << endl;
n++;
}
}
赋值。
现在,我想捕获n
值并将它们存储在新程序中,同时出现在命令窗口中。
答案 0 :(得分:2)
我为通过管道进行通信的两个过程做了一个非常简单的示例。
由于我打算在coliru上进行演示,因此我不得不将两个过程的代码都放在一个程序中。程序是充当编写者还是充当阅读者,取决于命令行参数。这是源代码:
#include <cstdlib>
#include <chrono>
#include <iostream>
#include <string>
#include <thread>
namespace Writer {
int main()
{
// produce some values
for (int i = 0; i < 10; ++i) {
// consume some time e.g. for reading camera
std::this_thread::sleep_for(std::chrono::duration<int, std::milli>(50));
// determine position
const int x = std::rand(), y = std::rand();
// write values to stream
std::cout << i << ' ' << x << ' ' << y << '\n';
}
// done
return 0;
}
} // namespace Writer
namespace Reader {
int main()
{
// consume some values
for (int i = 0;; ++i) {
// read values
int iW, x, y;
if (!(std::cin >> iW >> x >> y)) break;
// report values
std::cout << i << ": " << iW << ", x: " << x << ", y: " << y << '\n';
}
// report lost input
std::cout << "End of input.\n";
// done
return 0;
}
} // namespace Reader
int main(int argc, char **argv)
{
const std::string arg1 = argc == 2 ? argv[1] : "";
if (arg1 != "-i" && arg1 != "-o") {
std::cerr << "Usage:\n"
<< "a.out -o ... to start the writer\n"
<< "a.out -i ... to start the reader\n";
return -1;
}
if (arg1 == "-o") return Writer::main();
else return Reader::main();
}
编译并开始于:
g++ -std=c++17 -O2 -Wall -pedantic -pthread main.cpp && ./a.out -o | ./a.out -i
输出:
0: 0, x: 1804289383, y: 846930886
1: 1, x: 1681692777, y: 1714636915
2: 2, x: 1957747793, y: 424238335
3: 3, x: 719885386, y: 1649760492
4: 4, x: 596516649, y: 1189641421
5: 5, x: 1025202362, y: 1350490027
6: 6, x: 783368690, y: 1102520059
7: 7, x: 2044897763, y: 1967513926
8: 8, x: 1365180540, y: 1540383426
9: 9, x: 304089172, y: 1303455736
End of input.
它是这样工作的:
main()
除了评估命令行参数并调用Reader::main()
或Writer::main()
以外(如果找不到合适的参数则显示错误)。 >
Writer::main()
产生一些值(延迟50毫秒,使它更令人兴奋/更逼真)并将其写入std::cout
。
Reader::main()
使用一些从std::cin
中读取的值。
就是这样。
真正的魔咒是这样称呼的:
./a.out -o | ./a.out -i
我不确定coliru背后是什么操作系统和外壳,但看起来像Linux。 (它可能也可以在Windows 10提示符下运行,但我对此并不熟悉。在我是cygwin64粉丝的情况下,我大多使用bash。)>
它在两个进程中以./a.out
开始-o
(C ++编译器的默认输出),另一个进程以arg -i
开始。因此,管道符号|
将前者的标准输出通道连接到后者的标准输入通道。 (管道的发明和这种管道语法是革命性的Unix概念之一。发明人想连接诸如花园软管之类的工具,我曾经在某处读过。)
为了公平起见,我必须承认是newbie在他的评论中提到了这个想法。