From a603cadf28a7937e4764c477de6b170a98e059b1 Mon Sep 17 00:00:00 2001 From: lsy2246 Date: Sat, 23 Dec 2023 22:24:12 +0800 Subject: [PATCH] =?UTF-8?q?=E9=80=9A=E8=AE=AF=E5=BD=95=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E7=89=88=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{contact.c => contact/contact_array.c} | 0 practice_code/idea/contact/contact_file.c | 169 ++++++++++++++++++ practice_test/main.c | 26 ++- 3 files changed, 179 insertions(+), 16 deletions(-) rename practice_code/idea/{contact.c => contact/contact_array.c} (100%) create mode 100644 practice_code/idea/contact/contact_file.c diff --git a/practice_code/idea/contact.c b/practice_code/idea/contact/contact_array.c similarity index 100% rename from practice_code/idea/contact.c rename to practice_code/idea/contact/contact_array.c diff --git a/practice_code/idea/contact/contact_file.c b/practice_code/idea/contact/contact_file.c new file mode 100644 index 0000000..aede1b9 --- /dev/null +++ b/practice_code/idea/contact/contact_file.c @@ -0,0 +1,169 @@ +#include +#include +#include +#include + +struct Contact//每个联系人的结构体 +{ + char name[20];//名字 + char sex[10];//性别 + char email[30];//email +}; + +enum Operate//选择的枚举函数 +{ + view=1,find,add,delete,quit//查看,查看个人,新增,删除,退出 +}; + +void view_mode(void)//查看所有联系人函数 +{ + FILE *file=fopen("contact.txt","a+b");//打开文件 + struct Contact contact;//声明一块结构体临时储存读取到的通讯录 + while(fread (&contact , sizeof(struct Contact) , 1 , file) == 1) + { + printf("姓名:%s",contact.name); + printf(" 性别:%s",contact.sex); + printf(" 电子邮箱:%s\n",contact.email); + } + fclose(file);//关闭文件 +} + +void find_mode(void)//查找联系人函数 +{ + FILE *file=fopen("contact.txt","a+b");//打开文件 + char tmp_name[20]="a";//申请接受用户的名字 + struct Contact contact;//临时接受的结构体 + printf("请输入需要查找的联系人:"); + scanf("%20s",tmp_name);//接受用户需要查找的姓名 + while(fread(&contact,sizeof(struct Contact),1,file) == 1) + { + if(strcmp(contact.name,tmp_name) == 0) + { + printf("姓名:%s",contact.name); + printf(" 性别:%s",contact.sex); + printf(" 电子邮箱:%s",contact.email); + fclose(file);//关闭文件 + return;//结束函数 + } + } + + printf("查无此人\n"); +} + +void add_mode(void)//新增联系人函数 +{ + FILE *file=fopen("contact.txt","a+b");//以读的方式打开文件 + struct Contact contact;//声明一个临时结构体来接收用户 + struct Contact tmp_contact;//声明一个结构体来检查有无重复 + printf("请输入姓名:"); + scanf("%20s",contact.name); + fseek(file, 0, SEEK_SET);//将文件指针移动到开头,并清除之前读取的内容 + //查找是否已经存入 + while(fread(&tmp_contact,sizeof(struct Contact),1,file) == 1) + { + if(strcmp(tmp_contact.name,contact.name) == 0) + { + printf("联系人已经存在\n"); + printf("姓名:%s",tmp_contact.name); + printf(" 性别:%s",tmp_contact.sex); + printf(" 电子邮箱:%s",tmp_contact.email); + fclose(file);//关闭文件 + return;//结束函数 + } + } + printf("请输入性别:"); + scanf("%10s",contact.sex); + printf("请输入电子邮箱:"); + scanf("%30s",contact.email); + while (strcmp(contact.email,"@") != 0) + { + while(getchar()!='\n');//清除缓存 + printf("请输入正确格式的电子邮箱:"); + scanf("%30s",contact.email);//重新接收 + } + fwrite(&contact,sizeof(struct Contact),1,file);//写入文件 + fclose(file);//关闭文件 + printf("新建成功\n"); + printf("姓名:%s",contact.name); + printf(" 性别:%s",contact.sex); + printf(" 电子邮箱:%s",contact.email); +} + +void delete_mode(void)//删除联系人函数 +{ + FILE *file=fopen("contact.txt","rb");//通讯录文件 + FILE *tmp_file=fopen("tmp_contact.txt","wb");//零时通讯录文件 + char tmp_name[20]="a";//临时接收用户需要删除的姓名 + struct Contact contact;//声明结构体找到需要删除的位置 + printf("请输入需要删除的联系人的姓名:"); + scanf("%s",tmp_name);//接收需要删除的联系人的姓名 + while(fread( &contact , sizeof(struct Contact) , 1 ,file ) == 1) + { + if( strcmp(contact.name,tmp_name) != 0) + { + fwrite(&contact,sizeof(struct Contact) , 1 ,tmp_file);//如果不是需要删除的名字写入临时文件 + } + } + fclose(file);//关闭文件 + fclose(tmp_file);//关闭零时文件 + remove("contact.txt");//将原有通讯录删除 + rename("tmp_contact.txt", "contact.txt");//将临时通讯录更名 + printf("删除成功\n"); +} + + +int main(void) +{ + int oprate=0;//创建选择 + start://主页面标签 + printf("\n———————通讯录——————\n"); + printf("%d.查看全部联系人\n",view); + printf("%d.查找联系人\n",find); + printf("%d.新增联系人\n",add); + printf("%d.删除联系人\n",delete); + printf("%d.退出程序\n",quit); + printf("请输入需要进入的模式:"); + while( (scanf("%d",&oprate)) != 1 || oprate < 1|| oprate > 5) + { + while(getchar()!='\n');//清除缓存 + printf("请输入正确的数字:"); + scanf("%d",&oprate);//重新获取数字 + } + switch(oprate) + { + case view: + { + while(getchar()!='\n');//清除缓存 + view_mode();//进入查看函数 + goto start;//回到主页 + break;//防止进入下一个 + } + case find: + { + while(getchar()!='\n');//清除缓存 + find_mode();//进看个人函数 + goto start;//回到主页 + break;//防止进入下一个 + } + case add: + { + while(getchar()!='\n');//清除缓存 + add_mode();//进入新增函数 + goto start;//回到主页 + break;//防止进入下一个 + } + case delete: + { + while(getchar()!='\n');//清除缓存 + delete_mode();//进入删除函数 + goto start;//回到主页 + break;//防止进入下一个 + } + case quit: + { + printf("欢迎下次使用\n"); + break; + } + } + return 0; +} diff --git a/practice_test/main.c b/practice_test/main.c index 9537f94..aede1b9 100644 --- a/practice_test/main.c +++ b/practice_test/main.c @@ -1,6 +1,6 @@ #include #include -#include +#include #include struct Contact//每个联系人的结构体 @@ -91,30 +91,24 @@ void add_mode(void)//新增联系人函数 void delete_mode(void)//删除联系人函数 { - FILE *file=fopen("contact.txt","r+b"); - char tmp_name[20]="a";//临时接收用户需要删除的姓名 + FILE *file=fopen("contact.txt","rb");//通讯录文件 + FILE *tmp_file=fopen("tmp_contact.txt","wb");//零时通讯录文件 + char tmp_name[20]="a";//临时接收用户需要删除的姓名 struct Contact contact;//声明结构体找到需要删除的位置 printf("请输入需要删除的联系人的姓名:"); scanf("%s",tmp_name);//接收需要删除的联系人的姓名 while(fread( &contact , sizeof(struct Contact) , 1 ,file ) == 1) { - if( strcmp(contact.name,tmp_name) == 0) + if( strcmp(contact.name,tmp_name) != 0) { - while(fread (&contact , sizeof(struct Contact) , 1 ,file ) == 1)//移动到下一个 - { - fseek(file,sizeof(struct Contact) ,SEEK_CUR);//将文件移动回上一个 - fwrite(&contact ,sizeof(struct Contact) , 1 ,file);//将本次内容写到上一个 - fseek(file, -(sizeof(struct Contact)) ,SEEK_CUR);//将文件移动回来 - } - fseek(file,sizeof(struct Contact),SEEK_END);//将文件移动到最后一个联系人 - struct Contact last_contact = {"\0","\0","\0"};//最后一个结构体都定义为空字符 - fwrite(&last_contact ,sizeof(struct Contact) , 1 ,file);//空字符写入 - fclose(file);//关闭文件 - return; + fwrite(&contact,sizeof(struct Contact) , 1 ,tmp_file);//如果不是需要删除的名字写入临时文件 } } - printf("查无此人"); fclose(file);//关闭文件 + fclose(tmp_file);//关闭零时文件 + remove("contact.txt");//将原有通讯录删除 + rename("tmp_contact.txt", "contact.txt");//将临时通讯录更名 + printf("删除成功\n"); }