16

私は現在、Linuxc++アプリケーションを設計しています。コマンドラインから実行されます。実行したら、実行を制御するコマンドを発行できるようにする必要があります。理想的には、次のようなものです。

$ sudo ./myapplication
APP > 
APP > 
APP > //just pressing return
APP > openlog test1.txt //APP will now call the openlog function
APP >

これは比較的簡単な作業だと思いますが、そのようなインターフェースを検索するためにどのようなインターフェースが呼び出されるのかわかりません。この機能を実行できるライブラリまたは例を知っている人はいますか?または、coutとcinを使用して自分で書く必要がありますか?もしそうなら、何か好ましいアプローチはありますか?

4

10 に答える 10

17

これには GNU readline ライブラリをお勧めします。入力の行を取得するという面倒な作業を処理し、ユーザーがバックスペース、左右の矢印などを使用して行を編集したり、上矢印を使用して古いコマンドを呼び出したり、^R を使用して古いコマンドを検索したりできるようにします。など。Readline は、Linux などの一般的な UNIX ライクなディストリビューションにインストールされていますが、持っていない場合は、ここで見つけることができます。

編集: これは最小限の readline の例です:

#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);
    }
}
于 2012-10-31T23:47:58.660 に答える
9

完全な行編集機能と履歴機能が必要な場合は GNU readline ライブラリが最適ですが、単純なプロンプトで十分な場合 (または GNU ライセンスが不要な場合) は、標準ライブラリだけでこれを行うことができます

#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";
}
于 2012-10-31T23:48:21.250 に答える
3

他の人が示唆しているように、GNU readline は断然優れた選択肢です。ライセンスの問題で除外せざるを得ない場合は、linenoiseを検討する必要があります。

于 2012-11-01T02:37:19.933 に答える
2

内省的でない言語ではこれが難しくなるという Chris のコメントに同意します。C++ では、入力したものを特定の関数に明示的にマップする必要があります。

独自のロールを作成する場合、一般的なデザインは次のようになります。

  • 入力行を読み取ります (ほとんどの場合、cin.getline を使用して文字列に変換します)
  • 最初の単語を特定し、それが何らかの関数にマップされているかどうかを判断します (たとえば、単純な switch ステートメント、ハッシュ テーブルなどを使用できます)。
  • 関数にマップされていない場合は、エラーを投稿してプロンプトを再表示します。
  • マップする場合は、行内の他の単語を調べる必要があります。
  • 他の単語ごとに、文字列を単語ごとに関数パラメーターとして必要なデータ型に変換する必要があります (ここでは stringstreams が便利です)。
  • ここで、指定したパラメーターが、呼び出した関数に対して正当であることを確認する必要があります。関数を呼び出す前にそれらを事前にチェックするか、関数内のエラーをチェックすることができます。
  • 関数名とパラメーターが正しい (そして正しい番号である) ことを確認したら、関数を呼び出すことができます。

リフレクティブ言語では、文字列を直接関数名に変換できる場合があるため、前半は非常に単純化されています。

于 2012-11-01T00:00:15.510 に答える
2

おそらくreadline ライブラリを見てください。少し学習曲線がありますが、自分で完全な CLI を再作成するよりもはるかに簡単です。ただし、プロジェクトに適していない可能性があるため、ライセンスを確認してください。

于 2012-10-31T23:44:52.750 に答える
1

少なくとも部分的に自分でロールする必要があります。GNU readline が少しは役立つかもしれません。これを実現し、実際にコードを追加できる「スケルトン」である短いプログラムについては、http://en.wikipedia.org/wiki/GNU_readlineを確認してください。

于 2012-10-31T23:43:47.937 に答える
-4

アプリケーションをTCLまたはPythonアプリケーションとして記述し、それらをフロントエンドとして使用できます。

于 2012-10-31T23:23:24.240 に答える