#include "stdio.h" #include "stdlib.h" #include "string.h" struct time { int year; int month; int day; }; struct note { char no[20]; char title[40]; char nr[200]; struct time rq; char file[20]; }kind[6]; char m,k,loop; char a=0,b=0,c=0,d=0,e=0,f=0; void deal_menu(int nx); //菜单处理函数 void file_read(void); //读文件函数 void add_file(void); //增加函数 void del_file(void); //删除记录函数 void edit_file(void); //编辑函数 void order(void); //统计,排列函数 void search(void); //查寻,列出记录函数 int search_file(FILE * fp, char * str); //菜单处理函数 void deal_menu(int nx) { for( ; ; ){ switch(nx) { case 1: file_read(); //读文件函数 break; case 2: add_file(); //增加函数
break; case 3: del_file(); //删除函数 break; case 4: edit_file(); //编辑函数
break; case 5: search(); //查寻,列出记录函数 break; case 6: order(); //排序函数 break; } } }
//读文件函数11 void file_read(void) { char ch; char filename[80]; FILE *fp; printf("请输入要打开的文件名:(如果不行,请输入文件的绝对路径)\n"); scanf("%s",filename); if ((fp=fopen(filename,"r"))==NULL) { printf ("不能打开所输入的文件\n"); exit (0); } while((ch=fgetc(fp))!=EOF) { putchar(ch); } fclose(fp); printf("\n"); ch=getchar(); }
//增加函数11 void add_file(void) { char filename[20],n[20],xx,loop; int i; int nc; FILE *fp; printf("\n请输入第几种类记录的信息:\n"); scanf("%d",&i); printf("准备第%d个类记录新增加一项内容\n",i); switch(i) { case 1: a++; break; case 2: b++; break; case 3: c++; break; case 4: d++; break; case 5: e++; break; case 6: f++; break; } //fflush(stdin);空stdin即标准输入流的缓冲区,防止它影响后面的数据输入 printf("输入序号:\n"); scanf("%s",kind[i].no); fflush(stdin);
printf("输入标题:\n"); gets(kind[i].title); fflush(stdin);
printf("输入内容:\n"); gets(kind[i].nr); fflush(stdin);
printf("输入日期\n"); scanf("%s%s%s",&(kind[i].rq.year),&(kind[i].rq.month), &(kind[i].rq.day)); fflush(stdin); printf("输入存放的文件名字\n"); scanf("%s",kind[i].file); fflush(stdin); printf("请确认文件名字(重新输入一遍):\n"); gets(filename); if ((fp=fopen(filename,"wb"))==NULL) { printf ("不能打开所输入的文件\n"); exit (0); } printf("\n恭喜您!!成功增加记录...\n"); fwrite(&kind[i],sizeof(struct note),1,fp); fclose(fp); exit(0); } //删除函数11 void del_file(void) { char n ,filename[20]; char i; FILE *fp; printf("要删除的第几类文件:\n"); scanf("%d",&n); fflush(stdin); switch(n) { case 1: a-- ;break; case 2: b-- ;break; case 3: c-- ;break; case 4: d-- ;break; case 5: e-- ;break; case 6: f-- ;break; } printf("输入删除的文件名字\n"); gets(filename); if ((fp=fopen(filename,"wb+"))==NULL) { printf ("不能打开所输入的文件\n"); exit (0); } printf("您已经成功删除!\n"); strcpy(kind[i].no," "); fflush(stdin);
strcpy(kind[i].title," "); fflush(stdin);
strcpy(kind[i].nr," "); fflush(stdin); strcpy(kind[i].rq.year," "); strcpy(kind[i].rq.month," "); strcpy(kind[i].rq.day," "); fflush(stdin); strcpy(kind[i].file," "); fflush(stdin); fwrite(&kind[i],sizeof(struct note),1,fp); fclose(fp); } //编辑函数11 void edit_file(void) { char filename[20],c,i,j; FILE *fp; printf("修改什么类型的序号\n"); scanf("%d",&i); fflush(stdin); printf("输入序号:\n"); scanf("%s",kind[i].no); fflush(stdin); printf("输入标题:\n"); gets(kind[i].title); fflush(stdin); printf("输入内容:\n"); gets(kind[i].nr); fflush(stdin); printf("输入年\n"); scanf("%s",kind[i].rq.year); fflush(stdin); printf("输入月\n"); scanf("%s",kind[i].rq.month); fflush(stdin); printf("输入日\n"); scanf("%s",kind[i].rq.day); fflush(stdin); printf("请输入想编辑的记事本文件名字:(如果不行,请输入文件的绝对路径)\n"); gets(filename); fflush(stdin); if((fp=fopen(filename,"wb"))==NULL) //通过wb的打开方式,从而使原来的内容丢失 { printf("不能打开所输入的文件\n"); exit(0); } fwrite(&kind[i],sizeof(struct note),1,fp); fclose(fp); exit(0); } //查找函数 int search_file(FILE * fp, char * str) { char ch; int flag = 0,i; fseek(fp,0,SEEK_SET); while((ch=fgetc(fp) )!= EOF) { flag = 0; if (ch == str[0]) { flag = 1; for (i = 1; str[i] != '\0'; ++i) { ch = fgetc(fp); if (ch == EOF || ch != str[i]) { flag = 0; break; } } } if (flag == 1) break; } return flag; } //查找函数,并列出 void search(void) { char s[20],i,j,filename[20]; FILE *fp; for(i=0;i<6;i++) strcpy(filename,kind[i].file); if((fp=fopen(filename,"r"))==NULL) { printf ("不能打开所输入的文件\n"); return 0; } printf("输入关键字\n"); scanf("%s",s); fflush(stdin); if(search_file(fp, s) == 1) printf("存在您所要查找的关键字%s",s); else printf("不存在您所要查找的关键字%s",s); exit(0); } //按统计并降序排列显示函数11 void order(void) { char i,j,tem; char t[6]; i=0; t[i++]=a; t[i++]=b; t[i++]=c; t[i++]=d; t[i++]=e; t[i++]=f; for(i=0;i<6-1;i++) for(j=0;j<(6-i-1);j++) { if(t[j]<t[j+1]) { tem=t[j]; t[j]=t[j+1]; t[j+1]=tem; } } printf("排序结果如下:\n"); for(i=0;i<6;i++) printf("%d\n",t[i]); printf("第一类有%d条\n",a); printf("第二类有%d条\n",b); printf("第三类有%d条\n",c); printf("第四类有%d条\n",d); printf("第五类有%d条\n",e); printf("第六类有%d条\n",f); exit(0); } main() { int nc; printf("姓名王盛武 学号:20041120301\n"); printf("提示:如果原来没有记录,请先增加记录\n\n"); printf("1.读取记事本文件\n"); printf("2.增加分类记事本的记录\n"); printf("3.删除分类记事本的记录\n"); printf("4.编辑分类记事本的记录\n"); printf("5.查询分类记事本的标题包含信息,并将所找到记录列出!\n"); printf("6.统计记录个分类总数,将序排列\n"); printf("7.请选择1-6:\n"); scanf("%d",&nc); deal_menu(nc); //菜单处理函数 } 声明:问题:1。怎么实现返回主菜单功能? 2。 为什么查找功能不能实现? 3。 为什么增加一个文件,排序的时候还全部是0?