C言語-コマンドの作成
前へ 目次へ 次へ 

2-2 mtype

【名前】 mtype - 指定した複数のファイルの内容を表示する。

【書式】 mtype filename1 [filename2 ...]

【解説】 指定されたファイルの内容を連続して表示する。UNIXのcatコマンドに似たものである。

使用例
 mtype abc def … ファイルabcとdefの内容を表示する。
 mtype a1 a2 a3 a4 a5 … ファイルa1, a2, a3, a4とa5の内容を表示する。

【参照】 atype のファイルオープンからクローズまでを指定したファイルの数だけ繰り返す。

【フローチャート・ソースリスト】(一部分 atype参照)

mtype


 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:
#include <stdio.h>
#include <stdlib.h>

#define STRING_MAX 256    /* 最大文字長の定義 */

int main(int argc, char *argv[])
{
    FILE *filep;
    char buff[STRING_MAX];
    int pnum;        /* パラメータ数 */

    if(argc < 2){        /* パラメータ数のチェック */
        printf("Usage : MTYPE filename1 [filename2 ...]\n");
        exit(1);
    }
    for(pnum = 1; pnum < argc; ++pnum){        /* ファイル数分繰り返す */
        if((filep = fopen(argv[pnum], "r")) == NULL){    /* オープンチェック */
            printf("can not open file. %s\n", argv[pnum]);
            exit(2);
        }
        while(fgets(buff, STRING_MAX, filep) != NULL)    /* 1行読み込み */
            printf("%s", buff);        /* 1行表示 */

        fclose(filep);        /* クローズ */
    }
    return(0);
}

 mtype の別バージョン(変数の使用数を減らし、ポインタを利用)

 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:
#include <stdio.h>
#include <stdlib.h>

#define STRING_MAX 256    /* 最大文字長の定義 */

int main(int argc, char *argv[])  /* → int main(int argc, char **argv) */
{                                 /*    でも良い */
    FILE *filep;
    char buff[STRING_MAX];

    if(argc < 2){                  /* パラメータ数のチェック */
        printf("Usage : MTYPE filename1 [filename2...]\n");
        exit(1);
    }
    while(--argc){            /* ファイル数分繰り返す */
        ++argv;
        if((filep = fopen(*argv, "r")) == NULL){    /* オープンチェック */
            printf("can not open file. %s\n", *argv);
            exit(2);
        }
        while(fgets(buff, STRING_MAX, filep) != NULL)   /* 1行読み込み */
            printf("%s", buff);          /* 1行表示 */

        fclose(filep);         /* クローズ */
    }
    return(0);
}

 argcには、パラメータ数+1の値が格納されているので、15行目で1減じてからwhileの判定をする。whileは、argcが0になるまで繰り返す。
 argvは、コマンドラインの最初のパラメータ(コマンド名)のアドレスを示しているので、16行目で加算している。

 例 mtype aaa1 bbb2 ccc3 ddd4 と入力した場合

argc = 5 argv = A(番地) *argv = ア(番地) **argv = 'm' fig
1回目
15行目   argc = 4 argv = A *argv = ア (mtype) **argv = 'm' *(*argv+1) = 't'
16行目   argc = 4 argv = B *argv = イ (aaa1)
17〜24行目 ファイルaaa1の内容を表示
 2回目
15行目   argc = 3 argv = B *argv = イ (aaa1)
16行目   argc = 3 argv = C *argv = ウ (bbb2)
17〜24行目 ファイルbbb2の内容を表示
3回目
15行目   argc = 2 argv = C *argv = ウ (bbb2)
16行目   argc = 2 argv = D *argv = エ (ccc3)
17〜24行目 ファイルccc3の内容を表示
4回目
15行目   argc = 1 argv = D *argv = エ (ccc3)
16行目   argc = 1 argv = E *argv = オ (ddd4)
17〜24行目 ファイルddd4の内容を表示
5回目
15行目   argc = 0 argv = F *argv = オ (ddd4)
26行目


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

 

 

inserted by FC2 system