サイトマップ / C言語講座出入り口総目次目次:ファイル>空白文字の出現頻度||デモ用

青い直線

空白文字の出現頻度

青い直線

[ランダムアクセスファイル]←このソース→[二分木探索(バイナリサーチ)]

/* switch case 文 */

/* 今日は、まず switch case 文について復習します。一般的な形式を、下に示します。

    switch (c) {
        case  A: 処理 A;
            break;
        case  B: 処理 B;
            break;
        case  C:処理 C;
            break;
        - - - - - - - - -		
        - - - - - - - - -		
        default:処理 N;
    }

c には、int 型の変数が入ります。c が A なら、処理A が行われます。以下同様です。switch case 文を使えば、c の値によって、様々な処理を行うことができます。

default: は、オプションです。"オプションです" という表現は、なくても良いという意味です。

もし、c が A か B か C なら、処理 C を行いたいなら、下記のように書きます。

        case  A: 
        case  B: 
        case  C:処理 C;
            break;

switch case 文は、if else 文に置き換えることができます。どちらの形式を選ぶかは、ソースプログラムの見やすさによります。今回のソースプログラム中の switch case 文を、if と else if を使って、下に示すように書き換えることができます。

    if (c == ' ')
        space++;
    else if (c == '\n')
        cr++;
    else if (c == '\t')
        tab++;
    else
        other++;

両者を見比べて下さい。分岐の数の多い時は、switch case 文のほうが見やすいので、switch case 文の使用を勧めます。

ソースプログラムの説明

まず最初にこのファイルを開いて下さい。ソースプログラムをコンパイルして実行する際には、ファイル名を”WTest.txt”に変更して、同じフォルダに置いてください。今日はテキストファイルを読み込み専用で開いて、その中に出現するスペース、改行コード、タブコード、その他の文字の数を、switch case 文を使って数えます。ソースプログラムの説明に入ります。

    unsigned long space, cr, tab, other;

space にスペース、cr に改行コード、tab にタブコード、other にその他の文字の数が入ります。これらの変数は、負の値を取ることはありません。大きなファイルを扱う可能性があります。そこで、変数の型を unsigned long にしました。

今回は、ファイルの名前をソースプログラム中に直接書き込んでいますが( "WTest.txt" )、キーボードから入力するようにしても良いと思います。その場合、関連するソースを以下のように書き換えて下さい。

    FILE *fp;
    char filename[64];

    printf("ファイル名を入力して下さい\t");
    scanf("%s", filename);

    if ((fp = fopen(filename, "r")) == NULL) {
        fprintf(stderr, "ファイルを開くことができません!\n");
        exit(2);
    }

"WTest.txt"というファイルを開くことに成功したら、そのファイルへのファイルポインタが返って来ます。それを、fp へ代入します。 */

/* ここからソースプログラム */

#include <stdio.h>
#include <stdlib.h>    /* exit(  ) で必要 */

void main(void);

void main(void)
{
    FILE *fp;
    unsigned long space, cr, tab, other;
    int c;

      /* long 型の整数には数字に L を付ける */
    space = cr = tab =  other = 0L;

    if ((fp = fopen("WTest.txt", "r")) == NULL) {             /* ファイルが開けなかったら */
        fprintf(stderr, "ファイルを開くことができません!\n"); /* メッセージを表示して */
        exit(2);                                              /* 終了 */
    }

    while ((c = getc(fp)) != EOF) {     /* ファイルの終わりまで1字づつ読む */
        switch (c) {                    /* c の値で分岐する */
            case  ' ': space++;         /* c はスペース */
                break;
            case  '\n': cr++;           /* c は改行 */
                break;
            case  '\t':tab++;           /* c はタブ */
                break;
            default:other++;            /* デフォルト */
        }
    }
    printf("ファイル名: WTest.txt\n");
    printf("スペース:%lu\n改行コード:%lu\nタブコード:%lu\nその他の文字:%lu\n",
                                                space, cr, tab, other);    /* 結果を表示 */
    fclose(fp);                                            /* 開いたファイルは必ず閉じる */
}

/* ここまでソースプログラム */

/* c = getc(fp) で、一文字ずつ c に読み込み、c の値によって分岐し、該当する変数の値をインクリメントします。

ここで使われている変数は long 型でした。以前に説明していると思いますが、インクリメント演算子は、変数の型のサイズで1増加させます。サイズを意識しなくても良いということです。1を加えるという表現では、

    space += 1L;
        または、
    space = space + 1L;

となります。

printf( ) が長すぎるので、途中で改行しています。コンパイラは、スペースやタブ、改行を無視するので、影響はありません。printf( ) の書式指定子は、変数が unsigned long なので、%lu を使います。 */

[ランダムアクセスファイル]←このソース→[二分木探索(バイナリサーチ)]

青い直線

/* (C) 2000- YFプロ. All Rights Reserved. */    提供:C言語講座−それ自体コンパイルできる教材を使った講座です−

青い直線

サイトマップ / C言語講座出入り口総目次目次:ファイル>空白文字の出現頻度||デモ用