Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C++ command line interface

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?

like image 825
Matthew Watson Avatar asked Oct 31 '12 23:10

Matthew Watson


3 Answers

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);
    }
}
like image 103
amaurea Avatar answered Oct 15 '22 23:10

amaurea


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";
}
like image 9
Kerrek SB Avatar answered Oct 15 '22 23:10

Kerrek SB


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.

like image 3
Brian Cain Avatar answered Oct 15 '22 22:10

Brian Cain