网站及app开发,wordpress用户发文章,网站公司logo设计,中国制造网下载这两天学完系统调用和标准IO#xff0c;之前的通讯录可以进行一些改进#xff0c;将数据保存到文件中(图我这里就不发了)。
原理#xff1a;每次启动程序时先从预设文件中以只读的形式读取保存的通讯录信息#xff0c;然后将读取到的信息导入到结构体中#xff1b;每次执…这两天学完系统调用和标准IO之前的通讯录可以进行一些改进将数据保存到文件中(图我这里就不发了)。
原理每次启动程序时先从预设文件中以只读的形式读取保存的通讯录信息然后将读取到的信息导入到结构体中每次执行退出时先将预设文件以更新方式打开并将文件中之前保存的信息清空然后将结构体的数据保存到文件中去再退出程序。 还有在文件写入时和读取时先写入读取保存数据的总个数让程序知道有多少数据要写入读取然后保存每个数据的字节数程序会根据每个数据的字节数来进行保存最后再保存数据。
与之前版本相比改动的只有主函数中加入了读取文件和写入数据这两个步骤还有的变动就是结构体从一个变成了两个将指针从原来一个结构体中分离出来方便数据从文件中的导入导出。下面是代码免得你们往前翻我把之前的代码都修改了考过来
头文件 head.h 唯一修改的就是结构体
#ifndef HEAD_H_
#define HEAD_H_#include stdlib.h
#include stdio.h
#include string.h
#include unistd.h // sleep函数头文件
#include sys/types.h
#include sys/stat.h
#include fcntl.h#define uint unsigned int
#define OK 0
#define ERROR -1
#define MALLOC_ERROR -2
#define N 20 typedef int ElementType;
typedef struct data
{ElementType ID; // ID号char Name [N]; // 姓名char Mobile_Phone [N]; // 手机号码char Home_Address [N]; // 家庭住址char Company_Tell [N]; // 公司电话}Data;
typedef struct _Node
{Data data;struct _Node* next; // 节点指针
}Node;typedef Node* PNode; // 重命名节点指针类型//显示操作界面
int Interface_Display ();//添加好友信息 (尾插法)
int Add_Friend (PNode head, ElementType num);//显示所有好友信息
int Friend_Information (PNode head);//查找好友
int Search_Friend (PNode head, char* Name);//删除好友
void Delete_Friend (PNode head, char* Name);#endif源文件 head.c 关于结构体的部分要进行修改
#include head.h//显示操作界面
int Interface_Display ()
{system (clear);printf (\t*****************************************\n);printf (\t~ 欢迎使用通讯录 ~\n);printf (\t~ ~\n);printf (\t~ 1 添加好友信息 ~\n);printf (\t~ 2 列表好友信息 ~\n);printf (\t~ 3 搜索好友 ~\n);printf (\t~ 4 删除好友 ~\n);printf (\t~ 5 退出 ~\n);printf (\t~ ~\n);printf (\t~ ~\n);printf (\t~ 作者believe ~\n);printf (\t*****************************************\n);printf ( \n);printf ( \n);printf (\t请输入对应数字选择相应功能);
}//添加好友信息 (尾插法)
int Add_Friend (PNode head, ElementType num)
{if (NULL head){return ERROR;}//创建一个新的结点PNode p (PNode) malloc(sizeof(Node)/sizeof(char));if (NULL p){return MALLOC_ERROR;}//将新数据赋给新结点system(clear); printf (\t*************添加好友***************\n);p-data.ID num;printf (\t好友的ID为%d\n, p-data.ID);printf (\n);printf (\t请输入好友的名字);scanf (%s, p-data.Name);printf (\n);printf (\t请输入好友的手机号);scanf (%s, p-data.Mobile_Phone);printf (\n);printf (\t请输入好友的家庭住址);scanf (%s, p-data.Home_Address);printf (\n);printf (\t请输入好友的公司电话);scanf (%s, p-data.Company_Tell);printf (\n);p-next NULL;//找到最后一个结点PNode Ptmp; //将头结点地址给临时指针PtmpPtmp head;while (Ptmp-next){Ptmp Ptmp-next;}Ptmp-next p;return OK;}//显示所有好友信息
int Friend_Information (PNode head)
{if (NULL head){return ERROR;}PNode p head-next;printf (\tID\t姓名\t\t手机号\t\t住址\t\t\t公司电话\n);while (p){printf (\t%d\t%s\t\t%s\t\t%s\t\t\t%s\n, p-data.ID, p-data.Name,p-data.Mobile_Phone, p-data.Home_Address, p-data.Company_Tell);p p-next;}putchar(\n);return OK;
}//通过名字查找好友
int Search_Friend (PNode head, char* Name)
{PNode p head;PNode q NULL;if ((NULL ! p) NULL ! (p-next)){while (p-next) {q p-next;if ((NULL ! q) 0 (strcmp(q-data.Name, Name))){printf (\t好友信息: \n\tID:%d\n\t姓名: %s\n\t手机号码: %s\n\t家庭地址%s\n\t公司电话: %s\n, q-data.ID, q-data.Name, q-data.Mobile_Phone, q-data.Home_Address, q-data.Company_Tell);}else{printf (\t对不起您的通讯录没有该好友\n);}p p-next;}}/* 另一种做法if (NULL head){return ERROR;}PNode p;int flag 1;for (p head-next; p ! NULL; p p-next){if (0 strcmp(p-data.Name, Name)){flag 0;printf (\t好友信息\n\tID: %d\n\t姓名: %s\n\t手机号码: %s\n\t家庭地址: %s\n\t公司电话: %s\n, p-data.ID, p-data.Name, p-data.Mobile_Phone, p-data.Home_Address, p-data.Company_Tell);}}fi (flag){printf (\t对不起您的通讯录没有该好友\n);}putchar(\n);*/return OK;
}//删除好友
void Delete_Friend (PNode head, char* Name)
{PNode p head;PNode q NULL;while (NULL ! p NULL ! (p-next)){q p-next;if (NULL ! q 0 strcmp(q-data.Name, Name)){p-next q-next;free(q);int j;printf (\t正在删除\n);printf (\t请稍候);fflush (stdout); //强制刷新缓存输出显示for (j 0; j 2; j){sleep (1); //linux使用sleep参数为秒printf (.);fflush(stdout); //强制刷新缓存输出显示}printf (\n);printf (\t该好友已成功删除\n);}else if (NULL q-next 0 ! strcmp(q-data.Name, Name)){printf (\t您的通讯录没有该好友\n);}p p-next;}
}
主函数 main.c 加入了数据的读取和写入已标明
/*******************************************************************
需求制作一个电子通讯录通过该通讯录能录入好友ID号、姓名(英文)、手
机号码家庭住址公司电话。
模块主界面主要显示软件功能A)添加好友信息 B)列表好友信息。(包含排序功能) C)搜索好友 D)删除好友A)用户输入INSERT命令后让用户输入好友信息。添加成功或失败都需提示B)用户输入DISPLAY命令后好友信息升序排列C)用户输入SEARCH命令后让用户输入将要搜索好友姓名查询。如果未搜索到请友好提示。如果搜索到显示处该好友信息D)用户输入DELETE命令后让用户输入将要删除好友姓名删除如果存在同名的多个好友则列表出所有同名的好友信息让用户通过输入ID号删除提示用户删除成功。
**********************************************************************/
#include head.hint main ()
{int Function;int i 0;char Name[N];int cho;// 创建头结点并为其分配空间PNode head_node (PNode) malloc(sizeof(Node)/sizeof(char));if (NULL head_node){return MALLOC_ERROR;}head_node-next NULL;/****************************************************************打开存放信息的文件并将里面的数据导入到链表中区
****************************************************************/// 以只读方式打开存放信息的文件FILE *fp1 fopen (student.txt, r); if (NULL fp1) { printf (fopen); return -1; } PNode tmp head_node; int count; int ret; // 保存读记录的个数并判断是否读到文件结尾如果读到文件结尾// 它返回一个非0 的值ret fread (count, sizeof(int), 1, fp1); if(ret ! 0) { for (i 0; i count; i) {// 创建新结点用来保存读取的数据Node *node (Node*)malloc(sizeof(Node)/sizeof(char)); int len; fread (len, sizeof(int), 1, fp1); // 读取数据长度fread ((node-data), len, 1, fp1); // 读取数据 node-next NULL; while (tmp-next) // 向后遍历{ tmp tmp-next; } tmp-next node; // 将结点导入链表中 } } if (ret 0 !feof(fp1)) // 读取失败{ perror (fread); return -1; } fclose (fp1); // 关闭刚刚打开的文件
/****************************************************************文件导入链表结束关闭文件
****************************************************************/ i 1; // i初始化i既是ID编号while (1){Interface_Display (); // 主界面scanf (%d, Function);switch (Function) // 功能选择{case 1: // 添加好友{Function 0;Add_Friend (head_node, i);int j;printf (\t正在添加\n);printf (\t请稍候);fflush (stdout); // 强制刷新缓存输出显示for (j 0; j 2; j){sleep (1); // Linux 使用sleep参数为秒printf (.);fflush (stdout); // 强制刷新缓存输出显示}printf (\n);printf (\t添加成功\n);printf (\t返回主菜单请输入1);scanf (%d, cho);if (1 cho){break;}else{printf (\t对不起您的输入有误请重新输入);scanf (%d, cho);break;}break;} case 2: // 显示好友信息{system (clear);printf (\t***********好友信息******************\n);printf (\n);Friend_Information (head_node);Function 0;printf (\t返回主菜单请输入1);scanf (%d, cho);if (1 cho){break;}else{printf (\t对不起您的输入有误请重新输入);scanf (%d, cho);break;}break;}case 3: // 查找好友{system (clear);printf (\t*************查找好友*************\n);printf (\t请输入您要查找的好友姓名:);scanf (%s, Name);printf (\n);int j; printf (\t正在查找\n);printf (\t请稍候);fflush (stdout); // 强制刷新缓存输出显示for (j 0; j 2; j){sleep (1); // Linux 使用sleep参数为秒printf (.);fflush (stdout); // 强制刷新缓存输出显示}printf (\n);Search_Friend (head_node, Name);printf (\t返回主菜单请输入1);scanf (%d, cho);if (1 cho){break;}else{printf (\t对不起您的输入有误请重新输入);scanf (%d, cho);break;}break;}case 4: //删除好友{system (clear);printf (\t*************删除好友*************\n);printf (\t请输入要删除好友的姓名:);scanf (%s, Name);printf (\n);Delete_Friend (head_node, Name);printf (\t返回主菜单请输入1);scanf (%d, cho);if (1 cho){break;}else{printf (\t对不起您的输入有误请重新输入);scanf (%d, cho);break;}break;} case 5: //退出通讯录{/****************************************************************退出程序前将链表中的数据导入到文件中去
****************************************************************/// 以更新方式打开存放信息的文件打开时会清空文件FILE *fp2 fopen (student.txt, wb); if(NULL fp2) { printf (fopen); return -1; } tmp head_node-next; // tmp为第一个结点count 0; // 用来存放链表长度while(tmp) // 求链表长度{ count; tmp tmp-next; }// 要写入数据的个数fwrite(count, sizeof(int), 1, fp2); tmp head_node; // tmp初始化while (tmp-next) { Node* p tmp-next; tmp-next p-next; // 写入数据的长度 int len sizeof(p-data); fwrite (len, sizeof(int), 1, fp2); //写入数据 fwrite ((p-data), sizeof(Data), 1, fp2); free (p); } fclose (fp2);
/****************************************************************数据保存结束即将退出程序
****************************************************************/Function 0;system (clear);exit (0);}default: //输入有误{Function 0;printf (\t对不起您的输入有误请重新输入);scanf (%d, Function);break;} } } return 0;
}