标题:统计一个文本文件中的单词个数和汉字个数
只看楼主
Dream_weaver
Rank: 1
等 级:新手上路
帖 子:37
专家分:2
注 册:2012-6-8
结帖率:100%
已结贴  问题点数:40 回复次数:20 
统计一个文本文件中的单词个数和汉字个数
统计一个文本文件中的单词个数和汉字个数
我在word里面输入了一段中文,一段英文 看它统计的数据(比如单词99 ,汉字99)
然后用一下程序实现统计,发现代码实现的统计数目均会多一个(如 单词100 ,汉字100)
这个问题怎么解决呢? 代码有点长。。。

环境:xp系统
软件:Microsoft Visual C++ 2008
语言:C

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int readData(char filename[]);
void writeData(int n , int x);
int hanzi(char filename[]);

int main(void)
{
    char name[40] = "e:\\abc2.txt";
    int word_num;
    int hanzi_num;
         
    word_num = readData(name);  
    hanzi_num = hanzi(name) ;         
    writeData(word_num, hanzi_num);
    return 0;
}

int readData(char filename[]) //此函数计算英文单词个数
{
    FILE* fp;
    char ch;
    char flag = 0;
    int num=0;
   
    if((fp = fopen(filename,"r")) == NULL)
    {
        printf("%s open failure",filename);
        exit(EXIT_FAILURE);
    }
    printf("%s open sucessfully!~\n",filename);
   
    while(!feof(fp))
    {
        ch = fgetc(fp);
        //(ch < 0x80)  排除汉字的干扰
        if((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z') || (ch >= '0' && ch <= '9'))
            flag = 0;
        else if(flag == 0 && (ch != '-' && ch != '/'&& ch != '\''))
        {
            num++;
            flag = 1;
        }
    }
    fclose(fp);
    return num;
}

int hanzi(char filename[])         //此文件计算汉字个数
{
    FILE* fp;
    int ch;  //注意这里是int型的
    int count = 0;
    if((fp = fopen(filename,"r")) == NULL)
    {
        printf("%s open failure.\n",filename);
        exit(EXIT_FAILURE);
    }

    while(!feof(fp))
    {
        ch = fgetc(fp);
        if(ch == -1)
            break;
        
        if(ch >= 0x80)
        {
            count++;
            ch = fgetc(fp);//为什么要再来一次? 哦 因为fgetc每次只能取到一个字节 汉字是两个字节(可能是为了废掉一个字节)
        }
        
    }
    fclose(fp);
    return count;
}

void writeData(int n,int x)  //此文件输出
{
    FILE* fp;
    if((fp = fopen("D:\\result.txt","a")) == NULL)
    {
        printf("File open failure!!!");
        exit(EXIT_FAILURE);
    }
   
    fprintf(fp,"文件中的单词个数为%d\n",n);
    fprintf(fp,"文件中的汉字个数为%d\n",x);
   
    printf("文件中的单词个数为%d\n",n);
    printf("文件中的汉字个数为%d\n",x);

    printf("结果保存在D:\\result.txt当中\n");
    fclose(fp);


}

搜索更多相关主题的帖子: Microsoft 文本文件 include xp系统 英文 
2013-08-04 18:35
赵疯子
Rank: 8Rank: 8
来 自:dream
等 级:蝙蝠侠
威 望:2
帖 子:365
专家分:737
注 册:2013-5-5
得分:1 
循环控制那里有点问题,当文件读到尾部时,判断逻辑值还会是1,所以还会继续循环,实际结果应该-1
2013-08-04 20:35
小小程序猿
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:1
帖 子:755
专家分:2785
注 册:2013-7-18
得分:0 
看你循环结束的条件

孤独与寂寞是催化一个人迅速成长的良药,没有之一
2013-08-05 07:40
邓士林
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:淮河河畔
等 级:贵宾
威 望:61
帖 子:2391
专家分:13384
注 册:2013-3-3
得分:0 
比如单词99 ,汉字99,这个怎么判别呢?都是99键盘输入,怎么区别汉字和单词,我还不知道

Maybe
2013-08-05 07:48
小小程序猿
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:1
帖 子:755
专家分:2785
注 册:2013-7-18
得分:4 
其实这个问题我曾经发过贴,各位斑竹的意见是,因为情况很多,各个汉子占的字节也不同。似乎是很难判断汉字。。。。。

孤独与寂寞是催化一个人迅速成长的良药,没有之一
2013-08-05 07:51
Dream_weaver
Rank: 1
等 级:新手上路
帖 子:37
专家分:2
注 册:2012-6-8
得分:0 
我查到的信息是:
字母占一个字节 汉字占两个字节。
ACSII编码只用到0-127(不使用字节的高位)
所以判别方式是:ch > 0x80

我觉得应该是可以实现的,不然word里面怎么统计出来的呢?
2013-08-05 09:48
Dream_weaver
Rank: 1
等 级:新手上路
帖 子:37
专家分:2
注 册:2012-6-8
得分:0 
回复 4楼 邓士林
我指的是统计的个数,
一段含中英文的文章,统计结果是汉字99个,单词99个
这里把数字 算作单词吧 包含在单词数目里面
2013-08-05 09:51
wp231957
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:神界
等 级:版主
威 望:422
帖 子:13681
专家分:53296
注 册:2012-10-18
得分:8 
用word wps的称呼 叫 中文字符(我的代码统计中文字符的数目和word  wps的结果一致)
为了简单 非中文单词我没统计
代码入下:
程序代码:
#include <stdio.h>

int main()
{
    char filename[] = "test.txt";
    FILE* fp;
    int ch;
    int cn_num=0;
    if((fp = fopen(filename,"r")) == NULL)
    {
        printf("%s open failure",filename);
        return 0;
    }
    while(!feof(fp))
    {
        ch = fgetc(fp);
        if(ch>127) {fgetc(fp);cn_num++;}
    }
    fclose(fp);
    printf("中文字符%d个.\n",cn_num);
    return 0;
}



DO IT YOURSELF !
2013-08-05 14:29
Dream_weaver
Rank: 1
等 级:新手上路
帖 子:37
专家分:2
注 册:2012-6-8
得分:0 
回复 8楼 wp231957
很明显 我的代码中计算汉字的部分 跟你写的代码几乎完全一样
单独对只含汉字的文件进行操作,我的程序结果也会是正确的
所以我需要的是能同时计算汉字个数和单词个数的程序,不是单一的一种
2013-08-05 20:48
Dream_weaver
Rank: 1
等 级:新手上路
帖 子:37
专家分:2
注 册:2012-6-8
得分:0 
回复 4楼 邓士林
环境确定的话,我想结果应该会唯一的
2013-08-05 20:53



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-418604-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.356815 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved