連載
» 2015年03月13日 11時00分 公開

【問題17】字句解析プログラムを作ろう完全マスター! 組み込みC言語プログラミング(19)(2/3 ページ)

[横田一弘 埼玉県立新座総合技術高等学校 教諭,MONOist]

テキストファイルの処理の仕方

 それではプログラムの説明をしましょう。最初はmainです。

 今回の課題ではファイルからデータを入力するので、最初に目的のファイルを開きます。17行目の

fp = fopen("words.c", "r");

 では、words.cを読み取りモードで開いています。

 fopenは成功するとストリームを返します。ストリームとはデータが流れ込む、または流れ出すプログラム内のデータの出入り口のことで、fopenは外部ファイルとストリームを結び付けます。

 C言語ではストリームをファイルポインタ(FILE*)で表します。fopneは失敗するとNULLを返すので、

    fp = fopen("words.c", "r");
    if (fp == NULL) {
        printf("Can¥'t open file.¥n");
        return 1;
    }

 のように、if文でファイルが開けなかったときの処理を書きます。

 words.cのmainの仕事は、単語、文字列、文字定数、コメントを見つけることで、これらが先頭の文字から見つけることができるようにC言語の文法はデザインされています。

 ここでmainのフローチャートを示します。

photo mainのフローチャート(画像クリックで拡大)

 ファイルから文字を読み取るにはfgetcを使います。fgetcはファイルの先頭から1文字ずつデータを読み取りますが、ファイルの末尾まで行くとEOFを返します。なので、テキストファイルを文字単位で初期するプログラムの形は、

    ch = fgetc(fp);
    while (ch != EOF) {
        ここでchを処理する。
        ch = fgetc(fp);
    }

となります。

 単語はif文で見つけます。文字が英字であるかはisalphaで判別できるので、単語の先頭の判別は

    if (isalpha(ch) || (ch == '_'))

 となります。

 単語が見つかったらcountをインクリメントし、skip_wordを呼び出します。ファイルの末尾まで行き着いたら、fcloseでストリームから外部ファイルを切り離します。

    fclose(fp);

Copyright © ITmedia, Inc. All Rights Reserved.