【C言語】ファイル内の文字数・行数・単語数をカウントする方法
ファイルとはディスク上の物理的な保存場所のことであり、ディレクトリとはファイルを整理・管理するために使われる論理的なパスのことです。すべてのファイルは、必ず何らかのディレクトリの中に存在します。
ファイルに対して行える基本操作は、主に次の3つです。
- ファイルを開く
- ファイルを処理する(読み込み・書き込み・編集)
- ファイルを保存して閉じる
例
ここでは、以下のような流れでファイルを扱う例を考えてみます。
- 書き込みモード("w")でファイルを開く
- キーボードから入力したテキストをファイルへ書き込む
入力となるテキストファイルの内容は次のとおりです。
Hi welcome to my world This is C programming tutorial From tutorials Point
このファイルに対してプログラムを実行すると、出力は次のようになります。
Number of characters = 72 Total words = 13 Total lines = 3
カウント用Cプログラム
以下は、ファイル内の文字数・行数・単語数をカウントするC言語プログラムの完全なソースコードです。
#include <stdio.h>
#include <stdlib.h>
int main(){
FILE * file;
char path[100];
char ch;
int characters, words, lines;
file=fopen("counting.txt","w");
printf("enter the text.press cntrl Z:\n");
while((ch = getchar())!=EOF){
putc(ch,file);
}
fclose(file);
printf("Enter source file path: ");
scanf("%s", path);
file = fopen(path, "r");
if (file == NULL){
printf("\nUnable to open file.\n");
exit(EXIT_FAILURE);
}
characters = words = lines = 0;
while ((ch = fgetc(file)) != EOF){
characters++;
if (ch == '\n' || ch == '\0')
lines++;
if (ch == ' ' || ch == '\t' || ch == '\n' || ch == '\0')
words++;
}
if (characters > 0){
words++;
lines++;
}
printf("\n");
printf("Total characters = %d\n", characters);
printf("Total words = %d\n", words);
printf("Total lines = %d\n", lines);
fclose(file);
return 0;
}
プログラムの仕組み
このプログラムのカウント処理のポイントは以下のとおりです。
- fgetc関数でファイルから1文字ずつ読み込み、読み取るたびに文字数(characters)をインクリメントします。
- 読み込んだ文字が改行(
\n)またはNULL文字(\0)であれば、行数(lines)をカウントアップします。 - 空白・タブ・改行・NULL文字のいずれかであれば、単語の区切りとみなして単語数(words)をカウントします。
- ループ終了後、文字が1つでも存在していれば、最後の単語と最終行がカウントされていないため、
words++とlines++で補正しています。
なお、fgetcの戻り値をEOFと比較する場合、より安全な実装としては変数chをint型で宣言することが推奨されます。
実行結果
上記のプログラムをコンパイルして実行すると、次のような結果が得られます。
enter the text.press cntrl Z: Hi welcome to Tutorials Point C programming Articles Best tutorial In the world Try to have look on it All The Best ^Z Enter source file path: counting.txt Total characters = 116 Total words = 23 Total lines = 6
このように、ファイルを開いて1文字ずつ読み込みながら条件分岐で集計するだけで、文字数・単語数・行数を簡単に求めることができます。テキスト解析ツールやログ解析など、さまざまな場面で応用できる基本的なテクニックなので、ぜひマスターしておきましょう。
-
数値を英語の単語に変換するCプログラムの書き方
数値で構成された文字列が与えられたとき、その数値を英語の単語(スペル表記)へ変換するのが本記事の課題です。例えば、入力が「361」であれば、出力は「Three hundred sixty one」となるようにします。この問題を解くためには、一の位・十の位・百の位・千の位など、それぞれの数字がどの桁に位置しているのかを意識することが重要です。なお、今回紹介するコードは最大4桁、つまり0から9999までの数値に対応しています。したがって、入力は0〜9999の範囲である必要があります。例として「1,111」を考えてみましょう。各桁は以下のように対応します。千の位:1(one thousand)百の位
-
Pythonで括弧の各深さごとの文字数をカウントするプログラムの作成方法
文字列 s が与えられます。この文字列は「X」「(」「)」の3種類の文字のみで構成されており、括弧は必ずバランスが取れていて、その間に「X」が含まれています。また、括弧は再帰的にネストしている場合もあります。 この課題では、最も浅い深さから最も深い深さへ向かって、各括弧の深さごとに「X」の個数を求めます。 入力例と出力例 たとえば、入力が s = (XXX(X(XX))XX) の場合、出力は [5, 1, 2] になります。 深さ0(最も外側の括弧の中)には「X」が5個 深さ1には「X」が1個 深さ2(最も内側の括弧の中)には「X」が2個 解き方のアプローチ この問題は、次の手順で解くこと