之前的通讯录进行文件保存
来源:互联网 发布:短地址生成算法 编辑:程序博客网 时间:2024/06/16 09:33
上次做完通讯录后,总是有点遗憾,就是没有把电话数据保存到本地,没有实质上的实现通讯录功能,今天,我把通讯录重新拿出来做了一次,对它进行文件保存。
做完之后,感觉其实很简单,就是在数据存入的时候,不要再添加结点到链表中了,直接把这个结构体数据保存到文件中,查看的时候就是从文件中把数据读出来,这个时候需要用到链表了,因为不知道文件中数据的数量,所以链表是一个不错的选择。读出来之后,再把链表打印一下。稍微麻烦一点的就是删除了,先把数据读出来,然后进行遍历删除,接着把原文件删除,然后再把链表一个一个存进文件。
/**********************************************************File Name: 通讯录项目(文件保存)Author: Date:2017-2-6Description: 实现通讯录功能Fuction List: show() 显示最初布局Init_list() 添加好友信息Print() 列表好友信息Search() 搜索好友Delete() 删除好友************************************************************/#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <unistd.h>#define ok 0#define error -1#define malloc_error -2#define N 20typedef struct node{char ID;char name[N];char tel[N ];char address[N];char company_phone[N];struct node *next;}Address;typedef Address* PAddress;int i = 1;//显示最初布局void show(){system("clear");printf("\t\t*********************************************\n");printf("\t\t* \twelcome to address book *\n");printf("\t\t* *\n");printf("\t\t*\tA) Add the information of friends *\n");printf("\t\t*\tB) Show all friends information *\n");printf("\t\t*\tC) Search for the friend *\n");printf("\t\t*\tD) Remove the friend *\n");printf("\t\t* *\n");printf("\t\t*********************************************\n");printf(" \n");printf(" \n");printf(" \n");printf(" \n");printf(" please input your choice:");}//添加好友信息int Init_list(PAddress h){if(h == NULL){return error;}PAddress p = (PAddress)malloc(sizeof(Address)/sizeof(char));if (p == NULL){return malloc_error;}system("clear");p->ID = '0'+i; i++;printf("\nplease input the name:");scanf("%s", p->name); //输入姓名printf("\nplease input the tel:");scanf("%s", p->tel); //输入手机号int j = 0;int len = 0;while(p->tel[j++] != '\0'){len++;}while(len != 11) //判断输入的手机号码是不是11位的{printf("\nplease input 11 numbers,input again:");scanf("%s", p->tel);len = 0;j = 0;while(p->tel[j++] != '\0'){len++;}}printf("\nplease input the address:");scanf("%s", p->address);printf("\nplease input the company phone:");scanf("%s", p->company_phone);j = 0;len = 0;while(p->company_phone[j++] != '\0'){len++;}while(len != 8) //判断输入的电话号码是不是8位的{printf("\nplease input 8 numbers,input again:");scanf("%s", p->company_phone);len = 0;j = 0;while(p->company_phone[j++] != '\0'){len++;}}p->next = NULL;int fd;int ret;fd = open("address_book.txt", O_CREAT | O_RDWR | O_APPEND, S_IRUSR | S_IWUSR);if(fd == -1){perror("open");return;}ret = write(fd, p, sizeof(Address));if(ret == -1){perror("write");return;}close(fd);return ok;}//列表好友信息void Print(){int fd;int ret;fd = open("address_book.txt", O_RDONLY, S_IRUSR | S_IWUSR);if(fd == -1){printf("There is no address_book.txt!\n");return;}PAddress h = (PAddress)malloc(sizeof(Address)/sizeof(char));PAddress p = (PAddress)malloc(sizeof(Address)/sizeof(char));ret = read(fd, p, sizeof(Address));if(ret == 0){printf("There is no friend!\n");return;}h->next = p;while(1){PAddress t = (PAddress)malloc(sizeof(Address)/sizeof(char));ret = read(fd, t, sizeof(Address));if(ret == 0){p->next = NULL;break;}p->next = t;p = p->next;}PAddress temp = h->next;while(temp){printf("Num:%c name:%s tel:%s address:%s company phone:%s\n", temp->ID , temp->name, temp->tel, temp->address, temp->company_phone);temp = temp->next;}printf("\n");close(fd);}//搜索好友int Search(int i){int fd;int ret;int flag = 1;fd = open("address_book.txt", O_RDONLY, S_IRUSR | S_IWUSR);if(fd == -1){printf("There is no address_book.txt!\n");return;}PAddress h = (PAddress)malloc(sizeof(Address)/sizeof(char));PAddress p = (PAddress)malloc(sizeof(Address)/sizeof(char));ret = read(fd, p, sizeof(Address));if(ret == 0){printf("There is no friend!\n");return;}h->next = p;while(1){PAddress t = (PAddress)malloc(sizeof(Address)/sizeof(char));ret = read(fd, t, sizeof(Address));if(ret == 0){p->next = NULL;break;}p->next = t;p = p->next;}PAddress temp = h->next;while(temp){if(temp->ID == i){flag = 0;printf("\n\n");printf("Num:%c name:%s tel:%s address:%s company phone:%s\n", temp->ID, temp->name, temp->tel, temp->address, temp->company_phone);printf("\n\n");}temp = temp->next;}if(flag){printf("\n\n");printf("Don't have the friend\n");printf("\n\n");}return ok;}//删除好友int Delete(int i){int fd;int ret;fd = open("address_book.txt", O_RDONLY, S_IRUSR | S_IWUSR);if(fd == -1){printf("There is no address_book.txt!\n");return;}PAddress h = (PAddress)malloc(sizeof(Address)/sizeof(char));PAddress p = (PAddress)malloc(sizeof(Address)/sizeof(char));ret = read(fd, p, sizeof(Address));if(ret == 0){printf("There is no friend!\n");return;}h->next = p;while(1){PAddress t = (PAddress)malloc(sizeof(Address)/sizeof(char));ret = read(fd, t, sizeof(Address));if(ret == 0){p->next = NULL;break;}p->next = t;p = p->next;}close(fd);PAddress temp = h;if(temp->next->next == NULL) //一个结点的表{if(temp->next->ID == i){PAddress tmp = temp->next;temp->next = NULL;free(tmp);ret = remove("address_book.txt");if(ret == -1){perror("remove");return;}int fd2 = open("address_book.txt", O_CREAT | O_RDWR | O_APPEND, S_IRUSR | S_IWUSR);close(fd2);printf("\n\n");printf("Deleted successfully\n");printf("\n\n");return ok;}else{return error;}} while(temp) // 此处temp 不能写temp->next 要考虑删除的是最后一个结点{if(temp->next->ID == i){PAddress p = temp->next;temp->next = p->next;free(p);printf("\n\n");printf("Deleted successfully\n");printf("\n\n");break;}if(temp->next->next == NULL ) //考虑i超出了表中元素的时候{return error;}temp = temp->next;}int fd1;fd1 = open("address_book.txt", O_RDWR | O_TRUNC | O_APPEND, S_IRUSR | S_IWUSR);temp = h->next;while(temp){ret = write(fd1, temp, sizeof(Address));if(ret == -1){perror("write");return;}temp = temp->next;}close(fd1);return ok;}int main(){char option[2]; //定义一个字符串存放输入的选项 去除回车键对循环的影响int back = 1;char id[3];PAddress head_node = (PAddress)malloc(sizeof(Address)/sizeof(char)); //定义头结点if(head_node == NULL){return malloc_error;}head_node->next = NULL;while(back--){show();scanf("%s", option); switch (option[0]) { case 'A' : {Init_list(head_node);system("clear");printf("\n\n\n\n\n\n");printf("Congratulations on your success to create contacts!\n");printf("\n\n\n\n\n\n");printf("If you want to back,please input (1):");scanf("%d", &back);break;}case 'B' :{back = 0;system("clear");printf("\n\n\n\n\n\n");Print();printf("If you want to back,please input (1):");scanf("%d", &back);break;}case 'C' :{back = 0;system("clear");printf("\n\n\n\n\n\n");printf("if you want to search your friend,please input ID:");scanf("%s",id);Search(id[0]);printf("If you want to back,please input (1):");scanf("%d", &back);break;}case 'D' :{back = 0;system("clear");printf("\n\n\n\n\n\n");printf("if you want to delete your friend,please input ID:");scanf("%s",id);if (Delete(id[0]) != ok){printf("\n\n");printf("num %d friend is not exist!", id);printf("\n\n");}printf("If you want to back,please input (1):");scanf("%d", &back);break;}default :{printf("\n\n");system("clear");printf("\n\n\n\n\n\n");printf("\t\tplaese input A、B、C or D!\n");printf("\n\n");printf("If you want to back,please input (1):");scanf("%d", &back);break;} }}return 0;}
0 0
- 之前的通讯录进行文件保存
- 通讯录的常用功能保存
- 通讯录(C语言、文件保存)
- 用链表实现通讯录,并保存到文件
- 电子通讯录(文件保存版)
- 通讯录的文件版本
- 设置eclipse在编译运行项目之前自动保存修改的文件
- 设置eclipse在编译运行项目之前自动保存修改的文件
- 设置eclipse在编译运行项目之前自动保存修改的文件
- eclipse 在编译运行项目之前自动保存修改的文件
- 删除之前的保存的图片
- 使用ini文件进行一些设置的保存
- C#对指定的文件调用RAR进行压缩保存
- Android采用SharedPreferences方式进行文件的保存与读取
- Java中的Zip进行多文件的保存
- 【C语言】通讯录实现以及信息保存至文件。
- 手机通讯录系统设计(带文件保存)
- 通讯录改进(可以保存至文件并读取)
- 解决textview末尾有时侯会显示不完整表情的问题
- python--导入
- Okio使用分析
- PAT A1031. Hello World for U (20)
- 远程工具——VNC
- 之前的通讯录进行文件保存
- CSS之外层带背景内层左右模式:右侧内容高度自增
- PFSI 开源啦,欢迎您来贡献您的代码
- java面试时遇到的一个有意思的小问题
- 延云YDB对spark广播数据broadcast的Cleaner改进
- Eclipse- Dynamic Web Module 3.0 requires Java 1.6 错误
- 深入.NET平台和C#编程 第一章 概念+上机
- [python协程gevent]之greenlet初识
- Redis中常用命令