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

How to run a C++ program in another C++ program?

本文关键字:c++ 程序 一个 另一个 运行      更新时间:2023-10-16

我有一个简单的c++程序,它接受输入并输出一些字符串。这样的:

$ ./game
$ what kind of game? type r for regular, s for special.
$ r
$ choose a number from 1 - 10
$ 1
$ no try again
$ 2
$ no try again
$ 5
$ yes you WIN!

现在我想写一个c++程序,可以运行这个c++程序,自动播放游戏,不需要用户输入,然后输出到文件或标准输出。

运行它会像这样:

./program game r > outputfile

game为游戏程序,r为常规玩法。

我该怎么做?我需要这个程序的主要原因是我想为一个更大的程序做自动测试。

您可以使用<cstdlib>中的std::system:

std::system("game r > outputfile");

返回值为./program,唯一参数必须为char const *类型。

但是,没有标准的方法来运行程序并为其提供标准输入。根据您的命令行判断,您使用的是某种Unix变体,其中popen<stdio.h>应该可以工作:
FILE *sub = popen("game r > outputfile", "w");

然后用stdio函数写sub,然后读outputfile

(但是对于简单的测试,我建议将程序的核心逻辑实现为一组函数/类,这些函数/类可以由自定义main函数在循环中运行;或者选择您最喜欢的脚本语言来处理这类事情。

在主源代码中添加调用函数并让它控制循环、日志记录和提供输入会更有效。它也不需要系统调用或其他魔法来实现。作为一名游戏程序员,我们会让自己的游戏尽可能多地运行以帮助调试,而这通常是通过内部代码完成的,而不是通过外部脚本或系统调用。

这个场景需要一个"脚本"。

Bash, Perl, Python -你能想到的。

最简单的例子:

写一个bash脚本来调用./program game r > outputfile

./program game r < test_input.txt > test_output.txt

对于更高级的场景,您可能需要查看"expect"。

您可能还想看看" staff ",它可能是"自动化您的自动化测试"的好方法:

http://staf.sourceforge.net/current/STAFFAQ.htm