#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);//关闭文件
}