0

次のコードがありますが、コマンド ラインから実行するときに -arguments の後にファイルの場所にオプションの引数を追加する方法がわかりません。私はたくさんの読書をしてきましたが、混乱しているだけです。これが現在のコードです。

int c;
while ((c = getopt(argc, argv, "vdras")) != EOF) {
    switch (c) {
        case 'v': v = true;
            break;
        case 'd': d = true;
            break;
        case 'r' : r = true;
            break;
        case 'a' : a = true;
            break;
        case 's' : s = true;
            break;
    }
}
argc -= optind;
argv += optind;

今できることは、これらすべてのコマンド (またはそれらのコマンドのサブセット) の最後にファイルを追加することです。

そのため、プログラムの有効な引数として -rda filehere または -a filehere または単に filehere と入力できます。

私はこのリンクを読んでい、すべてのコマンドラインオプションの間に二重のセミコロンを置くと信じています。したがって、次のようになります。

while ((c = getopt(argc, argv, "::v::d::r::a::s::")) != EOF) {

条件の後にオプションの引数を指定できますが、それらをキャプチャする方法がわかりません。のように、ランダムなファイル名を入力してテストコードを出力するケースを作成しようとしてきたので、それが機能していることはわかっていますが、うまくいかないようです。*optarg を何らかの方法でスイッチに組み込む必要があるかどうか疑問に思っています。これにより、オプションに続く引数を取得できるようになりますが、これを行う方法がよくわかりません。どんな説明でも素晴らしいでしょう。

4

1 に答える 1

1

マニュアルページを読みましたか? オプション引数がある場合は、グローバル変数になりますoptarg

そこにあるリンクでさえ同じことを言っています。オプション文字列にも先頭は必要ありません::。文字の後のものだけが意味を持ちます。

編集:これは、あなたがやろうとしているように見える完全な動作例です:

#include <unistd.h>
#include <iostream>

int main(int argc, char **argv)
{
    int ch;

    while ((ch = getopt(argc, argv, "v:")) != -1)
    {
        switch (ch)
        {
            case 'v':
                std::cout << optarg << std::endl;
                break;
        }
    }
    return 0;
}

そして出力:

$ ./example -v abcde
abcde
于 2013-06-12T00:50:16.863 に答える