C语言读取文件中所有单词出现的次数并输出到屏幕和文件中

xiaoxiao2021-02-28  43

#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; } }
转载请注明原文地址: https://www.6miu.com/read-2622492.html

最新回复(0)