サイトマップ / C言語講座>出入り口>総目次>目次:ファイル>空白文字の出現頻度||デモ用
[ランダムアクセスファイル]←このソース→[二分木探索(バイナリサーチ)]
/* 今日は、まず 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言語講座−それ自体コンパイルできる教材を使った講座です−