プロが教える店舗&オフィスのセキュリティ対策術

https://oshiete.goo.ne.jp/qa/8940272.html
 の11行目に
fp = fopen(argv[1], "r");の[1]の意味が分かりません。
試したいのですが、ソフトがうまく動きません
 よろしくお願いいたします。

質問者からの補足コメント

  • 沢山の文章でのご解説にありがとうございす。
     現在解析中です。
     しばらくお待ちくださいませ^^

      補足日時:2015/03/25 05:18
  • Glory_777さまご回答誠にありがとうございます。
     暇暇読ませていただいております。
    ご回答までもうしばらくお待ちくださいませ。

    No.1の回答に寄せられた補足コメントです。 補足日時:2015/04/01 05:38

A 回答 (2件)

前の例題も読みました。



大分苦戦しているようですが、配列については理解が進みましたでしょうか?
お答えしますと、最初のパラメータ文字列が代入されています。

古いC言語の約束でして大変有名なものです。

コマンドラインコンソールから実行ファイル名を書いて、
パラメータをスペースで区切って指定したとします。

このパラメータ文字列が[1]以降に入ります。
例として、"test"と言う名前の実行ファイルがあったとします。

例)> test test1 test2 3 4

このようにコマンドラインから入力し実行すると、

argc = 5
argv[0] = "test"
argv[1] = "test1"
argv[2] = "test2"
argv[3] = "3"
argv[4] = "4"

と文字列が入ってきます。

以下はサンプル。

void main( int argc , char *argv[])
{
if( argc < 2 )
{
// パラメータ指定がなかった場合の表示
printf( "test に続けて4つまでパラメータを入力できます\n");
exit(0);
}
if( argc > 5 )
{
 // パラメータが5つ以上あった場合の表示
printf( "5つ以上のパラメータは受け付けません\n");
exit(-1);
}

// 正常ルート
printf( "パラメータの数は%d個ですね?ニヤッ\n", argc-1);
printf( "最初のパラメータは%sでしょ?\n", argv[1]);
printf( "残りはargv[2]以降ですが、面倒なので表示しません\n");
}

と言う具合に、引数を活用できます。argv[0]には、実行ファイル名が入ります。
argc は実行ファイルの名前も含めてカウントされます。

プログラムによっては必要な引数の数が変わりますし、
ユーザーのコマンドラインからの入力ミスなどでパラメータがなかったり、
必要なパラメータが不足していたりしますので、
argcとargvを使って最初にシンタックスエラーチェックをするのが常道です。

実行ファイル名の指定がなく、プログラムが実行されることはないと思われます
から、argcは1以上の値になります。

argc, argvの活用は、
実行コマンドを手打ちで打ち込むコンソール形式でよく用いられる基本的な
アプリケーションの開発手法です。

ご質問の箇所は、
第一パラメータにプログラム内で読み込むファイルのファイル名を指定してるの
でしょう。(よくあります)

しかし、Windowsなどのウィンドウを使用するアプリケーションは、
これとは違っておりますので注意が必要です。
(C言語とは別に、Windowsに特化した開発ノウハウの勉強が必要です)

Windows系で上記の様な基本的なプログラムを作成する場合は、
プロジェクトの作成時に(VisualStudioなどで)コンソールアプリケーション
を選んで作成します。実行時にコンソールが開きます。

Linuxの場合は、コンソールがデフォルトになっているでしょうから、
(特殊な設定がなければ)そのまま作成できます。

テキストエディタでソースを記述し、gcc などでコンパイルします。
実行形式ファイルが出来ていれば、想定どおりの動作をするでしょう。

ファイルの読み込みが出来るようになったら、
ファイルの内容を書き換えて保存したり、
ファイル名を変えたり、
ディレクトリ内のファイルを全て表示したり、
ファイル内に含まれる文字列を検索し、該当するファイルをリストしたりなど、

有用なサンプルプログラムを沢山作って練習します。

ファイルを読み込む先は、char型の配列でバイトサイズのメモリーとして確保
します。メモリーと変数の関係を充分に理解することをお勧めします。
殆どのプログラムは、このメモリーの確保やメモリーサイズの計算と格闘する
場合が多くなるからです。

バイナリー形式のファイル(すべてはバイナリー形式として良いのですが)に
ついて理解が深まった後は、
bmpの画像ファイル、wavなどの音声ファイルをあけて、
これの中身を書き換えて遊びます。

特にwavファイルは、音量の変更や周波数フィルタなども掛けれますので、
メモリ、配列、ファイルの関係を(焦らずに)ゆっくり理解するだけで、
今の知識レベルでも面白いことが沢山出来ます。

以上、ご参考に成れば。
この回答への補足あり
    • good
    • 1
この回答へのお礼

ご回答誠にありがとうございました^^
語んで調べましたが、私の域を超えたレベルだと判断いたしました。
ご回答は素晴らしさが伝わってきました。
 私のレベルを上げることで理解度を増すよう努力いたします。
今後ともよろしくお願いいたします。

お礼日時:2015/04/02 05:24

JIS X 3010:2003 / 5.1.2.2.1 プログラム開始処理 より抜粋


> argc の値が正の場合,argv[0]が指す文字列は,
> プログラム名(program name)を表す。
> argc の値が 1 より大きい場合,argv[1]から argv[argc-1]までが指す文字列は,
> プログラム仮引数(program parameter)を表す。

というわけで、
if ( argc < 2 )
でなければ
「argc の値が 1 より大きい」
なので
argv[1] は「プログラム仮引数の1番目」です。

具体的な例 (Windows のコマンドプロンプト画面でプログラムを動かす場合)
実行
C:\hoge>行数計算.exe 計算対象.txt 無関係な引数
結果
argc == 3
strcmp(argv[0], "c:\\hoge\\行数計算.exe") == 0 // たぶん
strcmp(argv[1], "計算対象.txt") == 0
strcmp(argv[2], "無関係な引数") == 0
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!