C语言运用文件和结构体的一个例子
- 格式:doc
- 大小:44.50 KB
- 文档页数:6
/*:1.该程序建立一个通讯录文件,可存放有姓名、电话号码、住址信息,并且有通信录输出、查找、添加、修改及删除功能。
2.请先阅读程序,依照现有函数,完成modify()和output()函数。
3.本程序缺陷,通讯录保存信息较简单;另外,每次运行程序,都重新建立通信录;请修改程序,增加email地址信息;修改程序,使之可以对现有通信录文件操作。
*/#include<stdio.h>#include<string.h>字符串处理程序struct person{char name[8];char tel[15];char addr[50];char em[20];};//filename数组存放通信录文件名char filename[25];FILE *fp;//主要函数原型声明void creat();void output();void search();void append();void modify();void delete();void exit();main(){int m;char k;printf("\n请输入你要打开的通讯录文件名:");gets(filename);if((fp=fopen(filename,"r"))==NULL){printf("\n当前没有此通讯录文件,现在是否执行创建(Y/N)?:");scanf("%c",&k);getchar();//用于接收输入后的回车键,下边的delete函数同理while(k!='Y'&&k!='N'&&k!='y'&&k!='n'){printf("\n输入有误,请再次输入一个值:");scanf("%c",&k);getchar();} if(k=='Y'||k=='y') {creat();}//当选择了Y或y时执行创建函数else if(k=='N'||k=='n'){printf("\n由于你选择了退出,现在程序即将关闭!\n");exit();} }else //当文件存在时把通讯录信息输出,并且提示操作{printf("\n你要打开的通讯录文件%s已存在,现在可直接对其操作*^_^*\n",filename);printf("\n通讯录文件%s现已有的通讯信息:\n",filename);output();printf("\n请根据提示选择1~5对通讯录文件进行操作*^_^*\n");}while(1){printf("\n添加,请按1");printf("\n查找,请按2");printf("\n修改,请按3");printf("\n删除,请按4");printf("\n输出,请按5");printf("\n退出,请按0\n");printf("请输入数字1~5:");scanf("%d",&m);getchar();while(m<0||m>5){printf("\n抱歉,您输入的值不是1~5的数字^@@^,请再次输入:");scanf("%d",&m);getchar();}if(m>=0&&m<=5){switch(m){case 1: append();break;case 2: search();break;case 3: modify();break;case 4: delete();break;case 5: output();break;case 0: exit();}printf("\n操作完毕,请再次选择!\n");}}}/*建立通信录函数creat():功能:建立通信录文件,并连续输入记录,以0结束输入*/void creat(){struct person one;if((fp=fopen(filename,"w"))==NULL){printf("\n不能建立通讯簿!");exit();}printf("\n成功创建%s通讯录文件,请按提示进行操作*^_^*\n",filename);fprintf(fp,"%-10s%-20s%-25s%-25s\n","姓名","电话号码","住址","电子邮件");printf("\n请输入每个成员的姓名、电话号码、住址和电子邮件(当成员名是0时结束输入):\n");scanf("%s",);while(strcmp(,"0"))//当输入的名字不为“0”的时候,执行循环,当名字为“0”时,退出循环{scanf("%s%s%s",one.tel,one.addr,one.em);fprintf(fp,"%-10s%-20s%-25s%-25s\n",,one.tel,one.addr,one.em);//把输入的信息按指定格式写入文件当中scanf("%s",);}fclose(fp);}/*输出函数output();通信录中所有通信记录,每行输出一条记录*/void output(){struct person one;if((fp=fopen(filename,"r"))==NULL){printf("\n不能打开通讯簿!");exit();}printf("\n\n%40s\n","< 通讯簿>");while(!feof(fp))//当文件未结束时,逐条读取文件信息并输出{fscanf(fp,"%s%s%s%s\n",,one.tel,one.addr,one.em);printf("%-10s%-20s%-25s%-25s",,one.tel,one.addr,one.em);}fclose(fp);}/*通讯录添加函数*/void append(){struct person one;if((fp=fopen(filename,"a"))==NULL){printf("\n不能打开通讯簿!");exit();}printf("\n请输入添加的姓名:");scanf("%s",);printf("请输入电话号码:");scanf("%s",one.tel);printf("请输入住址:");scanf("%s",one.addr);printf("请输入电子邮件:");scanf("%s",one.em);fprintf(fp,"%-10s%-20s%-25s%-25s\n",,one.tel,one.addr,one.em);printf("\n你添加的信息:\n");printf("%-10s%-20s%-25s%-25s\n","姓名","电话号码","住址","电子邮件");printf("%-10s%-20s%-25s%-25s\n",,one.tel,one.addr,one.em);fclose(fp);}/*通讯录查找函数*/void search(){int flag=0;char namekey[8];struct person one;printf("\n请输入你要查找的姓名:");scanf("%s",namekey);if((fp=fopen(filename,"rb"))==NULL){printf("\n不能打开通讯簿!");exit();}while(!feof(fp)){fscanf(fp,"%s%s%s%s\n",,one.tel,one.addr,one.em);if(!strcmp(namekey,)){printf("\n已查到,记录为:");printf("\n%-10s%-18s%-25s%-25s",,one.tel,one.addr,one.em);flag=1;}}if(!flag)printf("\n对不起,通讯簿中没有此人的记录。
");fclose(fp);}/*通讯录个人信息修改函数*/void modify(){int flag=0;long offset;char namekey[8];struct person one;printf("\n请输入姓名:");scanf("%s",namekey);if((fp=fopen(filename,"r+"))==NULL){printf("\n不能打开通讯簿!");exit();}while(!feof(fp)){offset=ftell(fp);//把文件位置指针的当前值赋给offsetfscanf(fp,"%s%s%s%s\n",,one.tel,one.addr,one.em);if(!strcmp(namekey,)) {flag=1;break;}}if(flag){printf("已查到,当前修改在通讯录的第%ld位,记录为:",(ftell(fp)/(sizeof(struct person))));//把通讯人的位置显示出来printf("\n%-10s%-18s%-25s%-25s",,one.tel,one.addr,one.em);printf("\n请输入新姓名、电话号码及住址:\n");scanf("%s%s%s%s",,one.tel,one.addr,one.em);fseek(fp,offset,SEEK_SET);//改变文件位置指针的位置,其中SEEK_SET代表着0,即是把文件位置指针指到所找到的通讯人处fprintf(fp,"%-10s%-20s%-25s%-25s\n",,one.tel,one.addr,one.em);//把新的通讯录信息输入文件当中}elseprintf("\n对不起,通讯簿中没有此人的记录。