C言語-インタプリタminiCASL |
4. プログラムファイルから直接読み込む
プログラムファイルをリダイレクション入力の機能を使用して読み込んだが、ここではファイルから直接プログラムを読み込むように変更する。プログラムファイル名はコマンドラインから取得する。
[コマンドラインの取得]
void main(int argc, char *argv[])
関数mainを上のように定義することで、変数argcにコマンドラインのパラメータ(引数)の個数、配列argvに各パラメータが格納される。
例えば、“mc05 reidai01.mc”と実行すると、変数argcは2となる。また、パラメータreidai01.mcは配列argv[1]に格納される。
argc = 2 | argv[0] = mc05 | |
argv[1] = reidai01.mc |
[ファイルの読み込み]
ファイルからデータを読み込む手順は次のとおりである。参照
ここではデータの読み込みに1行単位の関数fgets()を使う。
[mc05.c] | |
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 34: 35: 40: 41: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: |
#include <stdio.h> #include <stdlib.h> #include <string.h> #define STRMAX 80 /* 文字列配列の大きさ */ void main(int argc, char *argv[]) { double data1, data2, ans; char buff[STRMAX]; @ *fp; /* ファイル操作用 */ if(argc != 2){ /* パラメータのチェック */ printf("使い方:MC filename\n"); exit(1); } if((fp = A (argv[1], "r")) == NULL){ /* ファイルのオープン */ printf("ファイル %s がオープンできませんでした。\n", B ); exit(1); } while(1){ fgets(buff, STRMAX, fp); /* データの読み込み */ if(!strcmp(buff, "add\n")){ /* 命令判定 */ fgets(buff, STRMAX, fp); /* データの読み込み */ data1 = atof(buff); /* 実数値に変換 */ fgets(buff, STRMAX, fp); /* データの読み込み */ data2 = atof(buff); /* 実数値に変換 */ ans = data1 + data2; }else if(!strcmp(buff, "sub\n")){ <<赤色の部分(24〜27行)と同じ>> ans = data1 - data2; }else if(!strcmp(buff, "mul\n")){ <<赤色の部分(24〜27行)と同じ>> ans = data1 * data2; }else if(!strcmp(buff, "div\n")){ <<赤色の部分(24〜27行)と同じ>> ans = data1 / data2; }else if(!strcmp(buff, "end\n")){ break; }else{ printf("Error : コマンドエラー\n"); continue; } printf("%f\n", ans); /* 結果表示 */ } C (fp); /* ファイルのクローズ */ } |
D:\Data\src>cc mc05.c gettoken.obj lld @link.i D:\Data\src>mc05 使い方:MC filename D:\Data\src>mc05 reidai ファイル reidai がオープンできませんでした。 D:\Data\src>mc05 reidai01.mc 23.450000 |
5行目の#define STRMAX 80 は、Cコンパイラ(正確には、プリプロセッサ)によって、プログラム中にSTRMAXがあれば、それを80に置き換えてくれる。数字だけでは何のデータかよくわからない場合などにそのデータに名前を付けるために使う。名前は、一般の変数と区別するために大文字を使用する。
23行目の文字列比較では、これまで"add"と比較してきたが、関数fgetsは改行文字(\n)も読み込んでしまうので、"add\n"と比較する必要がある。他の命令判定の文も同じである。
Copyright © 2001 Hiroshi Masuda |