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. ファイルを読み込みモードで開く(オープンする) 関数fopen()
  2. ファイルからデータを読み込む 関数fgetc() … 1文字単位、関数fgets … 1行単位
  3. ファイルを閉じる(クローズする) 関数fclose()

 ここではデータの読み込みに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
[解答欄] (すべて半角文字で、空白文字もチェックされます。)
@   A
B   C
     

  5行目の#define STRMAX 80 は、Cコンパイラ(正確には、プリプロセッサ)によって、プログラム中にSTRMAXがあれば、それを80に置き換えてくれる。数字だけでは何のデータかよくわからない場合などにそのデータに名前を付けるために使う。名前は、一般の変数と区別するために大文字を使用する。

 23行目の文字列比較では、これまで"add"と比較してきたが、関数fgetsは改行文字(\n)も読み込んでしまうので、"add\n"と比較する必要がある。他の命令判定の文も同じである。


前へ 目次へ 次へ 
Copyright © 2001 Hiroshi Masuda 

 

 

inserted by FC2 system