I'm currently designing a linux c++ application. It will be run from the command line, then once running I need to be able to issue commands to control its execution, ideally something like the following:
$ sudo ./myapplication
APP >
APP >
APP > //just pressing return
APP > openlog test1.txt //APP will now call the openlog function
APP >
I imagine this is a relatively simple task, but I have no idea what such an interface would be called in order to search for one. Does anybody know of a library or example that can perform this function? Or do I need to write my own using cout and cin? If so, would there be any preferred approach?
I recommend the GNU readline library for this. It takes care of the tedious work of getting lines of input, and allows the user to edit his line with backspace, left and right arrows, etc, and to recall older command using the up arrow and even search for older command using ^R, etc. Readline comes installed with typical unix-like distributions like linux, but if you don't have it, you can find it here.
Edit: Here is a minimal readline example:
#include <stdio.h>
#include <readline/readline.h>
#include <readline/history.h>
int main(int argc, char ** argv)
{
while(1)
{
char * line = readline("> ");
if(!line) break;
if(*line) add_history(line);
/* Do something with the line here */
free(line);
}
}
The GNU readline library is great if you want full line-editing and history features, but if a simple prompt suffices (or if you don't want the GNU license), then you can do this with just the standard library:
#include <iostream>
#include <string>
void process(std::string const & line);
int main()
{
for (std::string line; std::cout << "APP > " && std::getline(std::cin, line); )
{
if (!line.empty()) { process(line); }
}
std::cout << "Goodbye.\n";
}
GNU readline is by far an excellent selection, as others have suggested. If licensing concerns would force you to rule it out, then you should then consider linenoise.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With