通过C ++程序实时返回变量

时间:2018-11-24 15:31:25

标签: c++

我有一个用c ++编写的程序。我正在寻找如何通过另一个c ++程序实时捕获其值的方法。 例如,我在程序中有如下内容:

[[file]]

这很简单,但是代表了我的真实程序如何工作,每隔几毫秒就会为int main() { int n = 0; while (true) { cout << n << endl; n++; } } 赋值。 现在,我想捕获n值并将它们存储在新程序中,同时出现在命令窗口中。

1 个答案:

答案 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.

Live Demo on coliru

它是这样工作的:

  1. main()除了评估命令行参数并调用Reader::main()Writer::main()以外(如果找不到合适的参数则显示错误)。 >

  2. Writer::main()产生一些值(延迟50毫秒,使它更令人兴奋/更逼真)并将其写入std::cout

  3. Reader::main()使用一些从std::cin中读取的值。

就是这样。

真正的魔咒是这样称呼的:

./a.out -o | ./a.out -i

我不确定coliru背后是什么操作系统和外壳,但看起来像Linux。 (它可能也可以在Windows 10提示符下运行,但我对此并不熟悉。在我是cygwin64粉丝的情况下,我大多使用bash。)

它在两个进程中以./a.out开始-o(C ++编译器的默认输出),另一个进程以arg -i开始。因此,管道符号|将前者的标准输出通道连接到后者的标准输入通道。 (管道的发明和这种管道语法是革命性的Unix概念之一。发明人想连接诸如花园软管之类的工具,我曾经在某处读过。)

为了公平起见,我必须承认是newbie在他的评论中提到了这个想法。