#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct Sword{
char word[200];
int num;
struct Sword * next;
}Sword;
void add(Sword * Head,char * str);
void display(Sword * Head,FILE * fp);
void release(Sword * Head);
int main(void){
FILE * fp;
char filename [] ="D:\\codesoftware\\Dev_C\\C_code\\file.txt";//打开读的文件位置 自定义
char str[200]; //暂存一个单词的数组
Sword * Head;
Head = (Sword *)malloc(sizeof(Sword)); //头指针
memset(Head,0,sizeof(Sword));
if((fp = fopen(filename,"r"))==NULL){ //读 初始化
printf("Can not open file");
exit(0);
}
while(fscanf(fp,"%s",str) != EOF){ //读文件
add(Head,str); //添加到链表
}
fclose(fp); //关闭读
if((fp = fopen(filename,"a"))==NULL){ //追加初始化
printf("can not open file");
exit(0);
}
display(Head,fp); //将各个单词统计结果显示到屏幕和文件中
fclose(fp); //关闭读
release(Head); //释放空间
return 0;
}
void add(Sword * Head,char * str){ //添加单词和统计个数
Sword * tw;
Sword * p = Head;
while(1){
if(strcmp(p->word,str)==0){ //判断是否和当前单词相同
p->num++; //相同此单词个数++
return;
}else{ //不同 遍历下个元素 看是否后后面的元素相同
if(p->next != NULL){
p = p->next;
}else{ //与链表上所有的都不同 新建一个节点
tw = (Sword *)malloc(sizeof(Sword));//动态分配内存空间
memset(tw,0,sizeof(Sword));
sprintf(tw->word,"%s",str);//将单词 保存
tw->num++; //单词数++
p->next = tw; //p的下一个节点为tw 就是连到链表上
return;
}
}
}
}
void display(Sword * Head,FILE * fp){ //统计单词和出现次数输出到屏幕和文件中
Sword * show;
for(show = Head->next;show != NULL;show = show->next){ //show指向第一个元素 然后往后遍历
printf("%s %d\n",show->word,show->num);
fprintf(fp,"%s %d\n",show->word,show->num);
}
}
void release(Sword * Head){ //释放空间
Sword * tw;
Sword * pre = Head;
while(pre != NULL){ //只要不为空
tw = pre->next; //tw暂存next
free(pre); //释放当前节点所占内存空间
pre = tw;
}
}
C语言读取文件中所有单词出现的次数并输出到屏幕和文件中
最新推荐文章于 2021-09-19 14:23:38 发布