■ テキストファイルの文字数を数える
/* counttxt.c :
* テキストファイルの文字数を数える
*/
#include <stdio.h>
#ifndef LSI_C /* Borland C++ 5.5 */
#include <conio.h> /* getch */
#endif
#define CT_KJ1 1
#define CT_KJ2 2
#define CT_HAN 3
#define CT_KANA 4
#define CT_CRLF 5
#define CT_SPC 6
#define CT_DAKU 7
#define CT_ILGL -1
int chkctype(char c, int type)
{
unsigned char uc = (unsigned char)c;
if (type == CT_KJ1) {
if ((uc>=0x40 && uc<=0x7e) || (uc>=0x80 && uc<=0xfc)) return CT_KJ2;
} else {
if ((uc>=0x81 && uc<=0x9f) || (uc>=0xe0 && uc<=0xfc)) return CT_KJ1;
else if (uc==0x0a || uc==0x0d) return CT_CRLF;
else if (uc==0x20 || uc==0x09) return CT_SPC;
else if (uc>=0x21 && uc<=0x7e) return CT_HAN;
else if (uc>=0xa1 && uc<=0xdd) return CT_KANA;
else if (uc==0xde || uc==0xdf) return CT_DAKU;
}
return CT_ILGL;
}
typedef unsigned long ULONG;
ULONG han = 0, zen = 0, kana = 0, crlf = 0, ilgl = 0, spc = 0;
void count(FILE *fp)
{
int mode = 0, ch;
while ((ch = getc(fp)) != EOF) {
mode = chkctype((char)ch, mode);
switch (mode) {
case CT_HAN: ++han; break;
case CT_KANA: ++kana; break;
case CT_CRLF: ++crlf; break;
case CT_SPC: ++spc; break;
case CT_DAKU: break;
case CT_KJ1: break;
case CT_KJ2: ++zen; break;
default: ++ilgl; printf("%02X ", (char)ch); break;
}
}
}
void graph(ULONG num)
{
int n = num * 10 / (han + kana + zen + spc);
while (n-- > 0) putchar('*');
putchar('\n');
}
void result(void)
{
putchar('\n');
printf("半角英数記号:%10ld ", han);
graph(han);
printf("半角カナ文字:%10ld ", kana);
graph(kana);
printf("全角文字 :%10ld ", zen);
graph(zen);
printf("空白・タブ :%10ld ", spc);
graph(spc);
printf("改行文字 :%10ld\n", crlf);
printf("不正な文字 :%10ld\n", ilgl);
printf("総文字数 :%10ld\n", han + kana + zen + spc);
}
int main(int argc, char **argv)
{
FILE *fp;
if (argc == 2) {
if ((fp = fopen(*(argv+1), "r")) != NULL) {
putchar('\n');
printf("ファイル名 :%s\n", *(argv+1));
count(fp);
result();
fclose(fp);
} else
puts("ファイルがオープン出来ません.");
} else
puts("【使い方】 CHCNT ファイル名");
printf("\npress any key to exit...");
getch();
putchar('\n');
return 0;
}