2000.11.15 KPC 情報技術科 関谷
コマンドライン引数は、プログラム7-1で説明があるほか、8-3 コマンド行で再度、解説がある。「MS-DOSプロンプト」の窓で、コマンド行で、プログラム名を指定して実行する際に、引数を指定するやり方である。C言語では、main()関数への2つの引数として実現している。引数の個数argcと文字列へのポインタ配列argvである。
コマンドライン引数の使用プログラムは、例を見ると分かるが、引数の個数argcを調べて、文字列へのポインタ配列argvを参照している。(添え字の0がプログラム名なので、入出力対象のファイル名は、*++argvとなるなど)
MSDNの使い方:
1)起動:スタート-プログラムMicrosoft Developer Network-MSDNライブラリをクリックする。
2)検索の方法:左の窓の「アクティブ サブセット」を「*Visual C++ドキュメント」にする。
検索かキーワードのタブで、語句を入力する。例えば、「コマンドライン引数」など調べたい語句です。 「検索開始」ボタンのクリックで、トピックの「トピック選択」に一覧表の候補が出てくる。
この例では、「引数の定義」を選択して、「表示」ボタンをクリックする。
右の窓にその解説が表示されるので、その内容を見る。
(ここで、さらに必要なら、左のトピックの選択を変えて、表示する。)
以下は、表示されたものを貼り付けたものです
引数の定義
以下のプロトタイプの引数を使うと、簡単にコマンドライン引数を解析できます。必要に応じて、環境変数にアクセスすることもできます。
int main( int argc[ , char *argv[ ] [, char *envp[ ] ] ] );
または
int wmain( int argc[ , wchar_t *argv[ ] [, wchar_t *envp[ ] ] ] );
引数の定義は次のとおりです。
argc
argv に格納されている引数の数を表す整数です。argc はプログラム名も引数として渡されるので、必ず 1 以上の値になります。
argv
NULL で終わる文字列の配列で、プログラムのユーザーが入力したコマンドライン引数を表します。規約では、argv[0] でプログラムを起動したコマンド名を表し、argv[1] で最初のコマンドライン引数を表します。以降は argv[argc] (必ず NULL) まで同様です。コマンドライン処理を行わない方法については、「C++ コマンドライン処理のカスタマイズ」を参照してください。
最初のコマンドライン引数は必ず argv[1] に保持され、最後のコマンドライン引数は argv[argc - 1] に保持されます。
(以下は省略)
ライブラリ関数で準備されているので、これらを使って、操作をすることになる。詳細は、MSDNライブラリを参照すると良い。
"FILE"で検索すると、標準型のページがあり、その中に「FILE構造体」の説明行がある。
FILE 構造体 ストリームの現在の状態に関する情報を格納する。すべてのストリーム入出力操作で使う。 STDIO.H にある。
"fopen"で検索すると、関数の説明がある。(途中で省略している)
fopen、_wfopen ファイルを開きます。 FILE *fopen( const char *filename, const char *mode ); FILE *_wfopen( const wchar_t *filename, const wchar_t *mode ); 関数 必要なヘッダー 互換性 fopenANSI, Win 95, Win NT _wfopen または Win NT (以下は省略するが、解説している項目として、以下の項目がある。) ライブラリ 戻り値 引数 解説 mode 文字列には、ファイルに対して要求する以下のアクセス モードを指定します。 プログラム例
プログラム7−3は、テキストファイルの入出力するプログラム例である。ファイル名は、コマンドラインの引数から、順番に入力ファイル名、出力ファイル名にしている。処理は、ファイル名を使ってファイルを開く。inpt()関数で、EOFになるまで、文字の配列s[1000]に読み込んでいる。文字の配列sの最後に文字列の終わり\0を最後に書いている。出力ファイル名で開き、outpt()関数で、文字の配列sを書き出している。ファイルの大きさが1000バイトを超えると、このプログラムは正しく動かなくなってしまう。
<実習上の注意やコメント>
1)プログラムは、C言語のプログラムの様式に合わせて作成のこと。なお、考察を先頭部分に書くのが良い。
2)ソースプログラムの入力方法:元になるプログラム7-1,7-2を貼り付けて、それを編集するのが早いし、様式も統一できる。入力の間違いも少ないであろう。
3)ソースプログラムの最初に、#include
4)ANSI Cとしては、関数のプロトタイプ宣言をmain()関数の前に、付けること。
void inpt(FILE *fp, char *s);
void outpt(FILE *fp, char *s);
入力したものを単に出力するだけのプログラムで、関数に分けるのをやめたもの。
先に、2つのファイルを開いて、読み込み後にすぐに書き出している。従って、文字の配列が不要になった。
このプログラムも、7-3を元に、編集すれば、入力は短時間で済む。
名前を文字配列で持つとして、3人の場合に、2次元の配列にするとか、構造を考えるかどうか? 次の問題の解答を見ると、そこまでは考慮していないようである。単純に、カンマなどで区切ることにして良い。
「名前を文字配列で持つとして、3人の場合に、2次元の配列にするとか、構造を考えるかどうか?」は、作ったプログラムに依る。単純に、文字の表示のみでも良い。
整数を文字に変換するのには、4章のratoi(m,t)を利用する。また、整数を1行ごとに記憶する。
テキストの問題文(上)にもあるように、この演習7ー3は、プログラムを0から作るのではない。既に作っている乱数作成プログラム(演習3ー8)を元に、整数を文字配列に変換して(この部分も利用)、テキストファイルとしての出力を追加する問題である。
平均値を計算するには、合計を求めて、それをデータ個数で割る。文字配列から整数に変換するのには、4章のnatoi(st)を改造して利用すれば良い。
レポートは、実習した全部のプログラムを順番に貼り付けて、レポート用のテキストファイルを作成のこと。
・フォルダ:w:\アプリケーション演習¥C言語74_fio ・ファイル名:nn氏名ap17.txt