【C语言】已有文本文件test.txt,编写一个程序,读取test.txt,统计各单词出现的次数,并将各单词和其出现的次数输出到文件和屏幕。

#include<stdio.h>

#include<string.h>

#include<ctype.h>

#define MAX_WORDS 100

#define MAX_WORD_LENGTH 50

int isDelimiter(char);

void countWords(FILE *file);

int main()

{

    FILE *file;

    char filename[] = "test.txt";

    //打开文件

    file = fopen(filename,"r");

    if (file == NULL)

    {

        printf("无法打开文件%s\n",filename);

        return 1;

    }

   

    //统计各个单词的数目并输出结果到屏幕和文件

    countWords(file);

    //关闭文件

    fclose(file);

    return 0;

}

//判断字符是否为分隔符

int isDelimiter(char c)

{

    return c==' ' || c=='\t' || c=='\r' || c=='\n' || c==',' || c=='.' || c=='?' || c=='!' || c==';' || c==':' || c=='"';

}

void countWords(FILE *file)

{

    char word[MAX_WORD_LENGTH];//暂时存储一个单词

    char words[MAX_WORDS][MAX_WORD_LENGTH];//保存全部单词的数组

    int counts[MAX_WORDS] = {0};

    int num_words = 0;

   

    //逐个字符读取

    int c,i;

    int word_len = 0;

    while ((c = fgetc(file)) != EOF)

    {

        //如果当前字符是分隔符,说明到了一个单词的结尾

        if (isDelimiter(c))

        {

            word[word_len] = '\0';//添加'\0'结尾,便于使用strcmp等函数

            //检查单词是否已经存在于数组中

            for ( i = 0; i < num_words; i++)

            {

                if (strcmp(word,words[i]) == 0)//比较两个字符串是否相等

                {

                    counts[i]++;//如果该单词出现过,增加该单词出现的次数

                    break;

                }

            }

            //如果单词不存在于数组中,则将其添加到数组中

            if (i == num_words)

            {

                strcpy(words[num_words],word);//将该单词加入到单词数组的末尾

                counts[num_words] = 1;//新添加的单词出现次数设为1

                num_words++;//单词数组的个数+1

            }

            word_len = 0;//重置单词的长度

        }

        else

        {

            //如果当前字符不是分隔符,则说明还没到该单词的结尾,将该字符添加到单词数组中

            if (word_len < MAX_WORD_LENGTH-1)

            {

                c = tolower(c);//将大写字母转换为小写字母

                word[word_len] = c;

                word_len++;

            }

        }

    }

    //输出单词及其次数到屏幕和文件中

    printf("单词出现次数统计结果:\n");

    FILE *output_file = fopen("word_count.txt","w");

    if (output_file == NULL)

    {

        printf("无法创建文件word_count.txt\n");

        return;

    }

    for ( i = 0; i < num_words; i++)

    {

        printf("%s:%d\n",words[i],counts[i]);//屏幕显示

        fprintf(output_file,"%s:%d\n",words[i],counts[i]);//写入文件

    }

    fclose(output_file);//关闭文件

}

   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值