用lex统计文本文件字符数

原创 2004年10月28日 13:06:00

我曾经在Linux上写的一个C程序,借助Lex做词法分析来同时统计N个文本文件的字符数,单词数和行数。让我觉得Lex确实挺有意思的。确实Lex的功能非常强大,用来做小巧的词法分析非常适合,也非常好用。这个程序参考了《Lex与Yacc》上的一个例子。

%{
unsigned int char_count = 0, word_count = 0, line_count = 0;
%}
%%
[^ /t/n]+ {word_count++; char_count+=yyleng;};
/n {char_count++; line_count++;};
.  char_count++;
%%
char **file_list;
unsigned int current_file = 0;
unsigned int total_file = 0;

unsigned int total_cc = 0;
unsigned int total_wc = 0;
unsigned int total_lc = 0;

typedef struct file_info{
    unsigned int c;
    unsigned int w;
    unsigned int l;
    char *name;
}INFO;

INFO **all;


int create_info(int num)
{
    INFO *tmp;
    int i;
    if (num <= 0){
        return -1;
    }
    all = (INFO **)malloc(sizeof(int *)*num);
    for (i = 0; i < num; i++){
        tmp = (INFO *)malloc(sizeof(INFO));
        tmp->c = 0;
        tmp->w = 0;
        tmp->l = 0;
        tmp->name = NULL;
        all[i] = tmp;
    }
    return 1;
}    

int delete_info(int num)
{
    int i;
    if ((all == (INFO **)0) || num <= 0){
        return -1;
    }
    for (i = 0; i < num; i++){
        free(all[i]);
    }
    free(all);
    return 1;
}

int set_info(int pos)
{
    int length = 0;
    if (pos < 0){
        return -1;
    }
    all[pos]->c = char_count;
    all[pos]->w = word_count;
    all[pos]->l = line_count;    
    all[pos]->name = file_list[pos]; 
    
    return 1;
}

int main(int argc, char** argv)
{
    FILE *file;    
    int position = 0;
    int i;
    
    file_list = argv + 1;
    total_file = argc - 1;
    current_file = 0;
    
    printf("--------------------------------------------------------------/n",
 total_file);   
   
    if (argc > 1){
        if (create_info(total_file) == -1){
            fprintf(stderr, "%s/n", "Encounter a error when malloc memory.");

            exit(1);
        } 
    }
    if (argc == 2){               
        
        file=fopen(argv[1], "r");
        if (!file){
            fprintf(stderr, "Could not open %s./n", argv[1]);
            delete_info(total_file);
            exit(1);
        }        
        yyin = file;
    }
    
    yywrap();
    yylex();
   
    if (argc > 1){
        total_cc += char_count;
        total_wc += word_count;
        total_lc += line_count;        
        
        if (set_info(current_file-1) == -1){
            fprintf(stderr, "%s/n", "Encounter a error when set information to
 INFO.");
            delete_info(total_file);
            exit(1);
        }        
        
        for (i = 0; i < total_file; i++){
            printf("char:%-8lu word:%-8lu line:%-8lu file name:%s/n", all[i]->
c, all[i]->w, all[i]->l, file_list[i]);
        }
        printf("----------------------- total --------------------------------
/n");
        printf("chars:%-8lu words:%-8lu lines:%-8lu files:%d/n", total_cc, tot
al_wc, total_lc, total_file);
    }else{        
        printf("char:%-8lu word:%-8lu line:%-8lu/n", char_count, word_count, l
ine_count);
    }
    
    delete_info(total_file);
    return 0;
}
 
yywrap()
{
    FILE *file = NULL;
    
    if ((current_file > 0) && (current_file < total_file) && (total_file > 1))
{
        total_cc += char_count;
        total_wc += word_count;
        total_lc += line_count;
        
        if (set_info(current_file-1) == -1){
            fprintf(stderr, "%s/n", "Encounter a error when set information to
 INFO.");
            delete_info(total_file);
            exit(1);
        }    
        
        char_count = word_count = line_count = 0;
        fclose(yyin);        
    }
    while ((file_list[current_file] != (char *)0) && (current_file < total_fil
e)){
        
        file = fopen(file_list[current_file++], "r");
        if (!file){
            fprintf(stderr, "could not open %s .", file_list[current_file - 1]
);
        }else{
            yyin = file;
            break;
        }
    }
    return (file? 0 : 1);
}

统计文件中字符个数

所谓“文件”是指一组相关数据的有序集合。这个数据集有一个名称 叫做文件名。文件通常是驻留在外部介质上的,在使用的时候才调 入内存中。就文件的分类,有很多种分类方式,在这里我们看一下文件编码方式。 ...
  • hongbochen1223
  • hongbochen1223
  • 2015年09月02日 09:49
  • 2697

java统计文件中字符,数字,汉字,空格数目

别人发的一个题目:   java上机实现统计D://document/file.txt文件中出现的字母个数、数字个数、汉字个数、空格个数及行数?  自己实现了下:  import jav...
  • jackwumengfeng
  • jackwumengfeng
  • 2013年11月29日 14:03
  • 2370

java统计一个文件的字符数,单词数,行数

 package A9chapter; import java.io.BufferedReader; import java.io.File; import java.io.FileInp...
  • ycy0706
  • ycy0706
  • 2015年05月03日 10:37
  • 3619

统计Txt文件中数字的个数

/******************************************************************** /*功能:统计txt文件中16进制数字个数。PS最后一个数...
  • Shayne_Lee
  • Shayne_Lee
  • 2016年08月16日 21:55
  • 534

文本中字符个数统计

编程实现读取文本,计数文本中内容字符数,不计空格、标点和制表符等。 初试写程序,请指正。 #include #include #include using namespace std; ...
  • u013754847
  • u013754847
  • 2016年03月21日 21:24
  • 202

Lex与Yacc学习(五)之正则表达式篇

正则表达式语法 lex模式是由编辑程序和实用程序使用的正则表达式的扩展版本。正则表达式由常规字符(代表它们本身)和元字符(在一种模式中具有特殊含义)组成。 元字符 . . 匹配除了换行符 \n 之外的...
  • fly_yr
  • fly_yr
  • 2015年01月21日 16:25
  • 3339

VIM中统计字符数

比如我要统计我的文本中有多少 “2014-11-10” 的字符串::%s/2014-11-10/&/gn
  • qdujunjie
  • qdujunjie
  • 2015年04月10日 17:27
  • 1317

【C++】计算字符个数

计算字符个数 题目描述 写出一个程序,接受一个有字母和数字以及空格组成的字符串,和一个字符,然后输出输入字符串中含有该字符的个数。不区分大小写。 输入描述: 输入一个有字母和数字以及空格组成的字符串,...
  • u011511601
  • u011511601
  • 2017年03月16日 20:16
  • 709

【Linux VI】 统计字符数

1. 统计全局中出现 abc 单 50,100s/hello world//gn
  • xunmengpiaoyun
  • xunmengpiaoyun
  • 2014年05月29日 16:21
  • 816

【c++程序】不同字符的个数统计

/*输入字符,ascii值在[0,127]时插入集合set中,输出set中的元素个数。 如:输入N个字符,字符在ACSII码范围内(0~127)。 输出字符的个数。*/ #include #i...
  • u012503639
  • u012503639
  • 2016年06月20日 21:48
  • 1224
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用lex统计文本文件字符数
举报原因:
原因补充:

(最多只允许输入30个字)