Mark
Mark

Reputation: 8678

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

I have a simple C++ program that takes in inputs and outputs some string. Like this:

$ ./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!

Now I want to write a c++ program can runs this c++ program and plays the game automatically without user input and then outputs it to a file or standard output.

Running it would look like this:

./program game r > outputfile

game is the game program, r for playing regular style.

How should I do this? The main reason I need this program is that I want to do automatic testing for a much bigger program.

Upvotes: 4

Views: 480

Answers (3)

paulsm4
paulsm4

Reputation: 121649

This scenario cries out for a "script", IMHO.

Bash, Perl, Python - you name it.

SIMPLEST CASE:

Just write a bash script to call ./program game r > outputfile.

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

For more advanced scenarios, you might want to look at "expect".

You might also want to look at "STAF", which might be a great way to "automate your automated tests":

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

Upvotes: 1

Michael Dorgan
Michael Dorgan

Reputation: 12515

I'd be more efficient to add a caller function to your main source and have it control looping, logging, and feeding input. It would also not require system calls or other magic to pull off. Being a game programmer, we have our games play themselves as much as possible to help with debugging, and almost always this is done via internal code, not through external scripting or system calls. It makes it easier to feed viable input as well.

Upvotes: 1

Fred Foo
Fred Foo

Reputation: 363567

You could use std::system from <cstdlib>:

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

The return value is ./program's, the sole argument must be of type char const *.

There is no standard way to run a program and feed it standard input, though. Judging by your command line, you're on some Unix variant where popen from <stdio.h> should work:

FILE *sub = popen("game r > outputfile", "w");

then write to sub with the stdio functions and read outputfile afterwards.

(But for simple testing, I'd recommend implementing the core logic of your program as a set of functions/classes that can be run by a custom main function in a loop; or pick your favorite scripting language to handle this kind of thing.)

Upvotes: 6

Related Questions