MMGamesロゴ  MMGames
Twitterシェアボタン  Facebookシェアボタン   
 English 

しんで覚えるC言語
しんで覚えるC言語

ドラッグへの対応

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

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

C言語には、アプリケーションの起動時にファイル名を渡す機能があります。
それが、コマンドライン引数です。

キーワード
【コマンドライン引数】

アプリケーション起動時に渡される文字列のこと。
主に処理するファイル名や動作オプションを指定する。


これまでmain関数の引数はvoid型として宣言してきましたが、
実は、ここには決められた型の引数を指定できます。
コマンドライン引数を受け取るためには、次のような引数を指定します。

コマンドライン引数を受け取れるmain関数
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行は画面の表示を止めるための処理です。実行待ちになり、適当なキーで終わります。

なお、筆者開発の学習用C言語開発環境をお使いの場合は、
上記の2行は必要ありません。自動的に止まるようになっております。

fflush(stdin)は邪道
上の命令は、出力バッファを強制出力する関数である fflush で、
入力バッファである stdin をクリアしています。
これは正しい使い方ではありません。邪道です。
この使用方法は練習段階でのみ使い、実際のアプリ開発では使わないでください。

エクスプローラで適当なファイルをドラッグしてみた結果は次の通りになります。

実行結果
D:\BCPad\Source\test.exe

ドラッグされたファイルの名前がフルパスで表示されています。

実行ファイルの位置
ほとんどの場合、コンパイルしたソースファイルと同じフォルダの中に、
ソースファイル名と同じ名前で実行ファイルが作成されています。

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

たとえば、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 オプション

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


本サイトについて

苦しんで覚えるC言語(苦C)は
C言語入門サイトの決定版です。
C言語の基本機能を体系立てて解説しており、
市販書籍と同等以上の完成度です。

第0部:プログラム概要編
  1. プログラムとは何か?
2章:プログラムの書き方
  1. 書き方のルール
  2. 書き方の慣習
  3. 練習問題2
3章:画面への表示
  1. 文字列の表示
  2. 改行文字
  3. 練習問題3
6章:キーボードからの入力
  1. 入力用の関数
  2. 入力の恐怖
  3. 練習問題6
9章:回数が決まっている繰り返し
  1. 繰り返しを行う文
  2. ループ動作の仕組み
  3. 練習問題9
10章:回数がわからない繰り返し
  1. 回数不明ループ
  2. 入力チェック
  3. 練習問題10
13章:複数の変数を一括して扱う
  1. 複数の変数をまとめて扱う
  2. 配列の使い方
  3. 練習問題13
20章:複数のソースファイル
  1. 最小限の分割
  2. 分割の定石
  3. 練習問題20

コメント
COMMENT

💬 コメント投稿欄を開く