Last Update: Nov.18,2006

C Source Library

「LSI C-86 Ver.3.30c 試食版」、「Borland C++ 5.5」でコンパイル出来ます。

■ テキストファイルの文字数を数える

/*  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;
}