サイトマップ / 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言語講座−それ自体コンパイルできる教材を使った講座です−