苦しんで覚えるC言語

ドラッグへの対応


第1項:ドラッグされたファイル名の取得

前項までの解説で、最低限のファイル処理は行えるようになりました。
しかし、毎回ファイル名を入力するのは面倒です。
エクスプローラ等からドラッグして開けるようになれば大変便利です。

実は、Windowsのコマンドプロンプト画面では、
ファイルをドラッグすれば、ファイル名が自動的に入力されます。
この方法であれば、ファイル名の入力は簡単にできます。
しかし、実行ファイルにファイルをドラッグした場合はできません。

C言語には、アプリケーションの起動時にファイル名を渡す機能があります。
それが、コマンドライン引数です。
コマンドライン引数
アプリケーション起動時に渡される文字列のこと。
主に処理するファイル名や動作オプションを指定する。
これまでmain関数の引数はvoid型として宣言してきましたが、
実は、ここには決められた型の引数を指定することができます。
コマンドライン引数を受け取るためには、次のような引数を指定します。

int main(int argc,char *argv[]);
argcはコマンドラインの数、argvは文字配列へのポインタ変数です。
文字配列へのポインタ変数と聞くと使い方が難しそうですが、
実際には次のようにするだけです。

printf("%s",argv[0]);
このようにすれば、0番目(1番最初)のコマンドラインを表示できます。
argv[0] の要素数を変えれば、それに対応するコマンドラインにアクセスできます。

コマンドラインの0番目は、アプリケーション自身のファイル名になります。
エクスプローラ等からドラッグしたファイル名は1番目に格納されています。

次のプログラムは、ドラッグされたファイル名を表示する例です。

#include <stdio.h>

int main(int argc,char *argv[])
{
    if (argc > 1) {
        printf("%s\n",argv[1]);
    }

    fflush(stdin);
    getchar();

    return 0;
}
argcでコマンドラインの数を確認し、1つより多ければコマンドラインがあると判断して、
1番目のコマンドラインの内容を表示しています。

fflush(stdin);
getchar();
上の2行は画面の表示を止めるための処理です。実行待ちになり、適当なキーで終わります。
fflush(stdin)は邪道
上の命令は、出力バッファを強制出力する関数である fflush で、
入力バッファである stdin をクリアしています。
この使い方は、一部のコンパイラでしか使えない邪道です。
この使用方法は練習段階でのみ使い、本格的な開発では使わないでください。
エクスプローラで適当なファイルをドラッグしてみた結果は次の通りになります。

D:\BCPad\Source\test.exe
ドラッグされたファイルの名前がフルパスで表示されています。
実行ファイルの位置
ほとんどの場合、コンパイルしたソースファイルと同じフォルダの中に、
ソースファイル名と同じ名前で実行ファイルが作成されています。

目次に戻る

第2項:オプションの解析

一般的に、コマンドラインにはファイル名の他に、
アプリケーションの動作を指定するオプションを指定することがあります。

例えば、Windowsでファイル名を指定して実行で defrag と指定して起動すると、
デフラグが起動して何もせずに終了しますが、
defrag c: と指定すると、Cドライブのデフラグを開始します。
また、defrag c: -a と指定すると、Cドライブの分析結果だけを表示します。
このような使い方は、パソコン上級者にはおなじみのやり方です。

この例では、 c: と -a という2つの文字列がコマンドラインに渡され、
それをアプリケーション内で解析して、動作を決定しています。

同様のことは、コマンドラインの文字列を調べれば簡単にわかります。
ここでは、-a と -s というオプションの有無を解析する例です。

#include <stdio.h>

int main(int argc,char *argv[])
{

    while (argc > 0) {

        argc--;

        if (argv[argc][0] == '-') {
            if (argv[argc][1] == 'a') printf("-a オプション\n");
            if (argv[argc][1] == 's') printf("-s オプション\n");
        }
    }

    return 0;
}
このプログラムに -a -s というオプションを与えて実行した結果は次の通りです。

-a オプション
-s オプション
同様にすれば、いくつのオプションにでも対応することができます。
また、先頭が - ではない文字列をファイル名として扱うようにすれば、
ファイル名も前項と同様に取得することができます。

目次に戻る