通讯录实现的功能 2017-01-11: 1、添加联系人 2、删除联系人 3、查找联系人 4、修改联系人 5、显示联系人 6、清空通讯录 7、按照姓名进行排序 8、退出程序 该通讯录将联系人的信息保存在文件中 在VS2013中打开文件直接创建,创建建的文件名字是contact.dat,操作步骤如下:
使用的文件操作函数如下: fopen 函数原型为 FILE *fopen( const char *fname, const char *mode ); 打开由fname(文件名)指定的文件并返回一个关联该文件的流.如果发生错误, fopen()返回NULL. mode(方式)是用于决定文件的用途 fwrite: 函数原型为 size_t fwrite ( const void * buffer, size_t size, size_t count, FILE * stream ); 从buffer(缓冲区)中, 写count个大小为size(大小)的对象到stream(流)指定的流. 返回值是已写的对象的数量. fread: 函数原型为: size_t fread( void *buffer, size_t size, size_t num, FILE *stream ); 读取[num]个对象(每个对象大小为size(大小)指定的字节数), 并把它们替换到由buffer(缓冲区)指定的数组 数据来自给出的输入流.
完整代码:
头文件:Addersss.h
1 #define _CRT_SECURE_NO_WARNINGS 1 2 #ifndef _ADDRESS_LIST_H_ 3 #define _ADDRESS_LIST_H_ 4 #include<stdio.h> 5 #include<string.h> 6 #include<stdlib.h> 7 #define NAME_MAX 12 8 #define TEL_MAX 12 9 #define SEX_MAX 5 10 #define ADDR_MAX 20 11 #define INIT 4 12 #define SIZE 4 13 enum OP 14 { 15 EXIT, //退出 16 ADD, //添加 17 DEL,//删除 18 SEARCH, //查找 19 REVISE, //修改 20 DISPLAY, //打印 21 SORT, //排序 22 EMPTY //清空 23 }; 24 typedef struct PerInfo 25 { 26 char name[NAME_MAX];//姓名 27 int age; // 年龄 28 char sex[SEX_MAX];//性别 29 char tel[TEL_MAX]; //电话 30 char address[ADDR_MAX];//地址 31 }PerInfo; 32 typedef struct Contact 33 { 34 PerInfo* data;//存储所有联系人的信息 35 int size; 36 int capacity; 37 }Contact, *Pcon; 38 void Add(Pcon Con); //添加联系人 39 void Delete(Pcon Con);//删除联系人 40 void Revise(Pcon Con);//修改联系人 41 void Search(Pcon Con);//查找联系人 42 void Display(Pcon Con);//打印联系人 43 void Init(Pcon Con);//初始化通讯录 44 void Save_Contact(Pcon Con); //存储联系人 45 void Load_Contact(Pcon Con);//加载联系人 46 void Empty(Pcon Con); //清空联系人 47 void Sort(Pcon Con);//对联系人进行排序 48 void Free(Pcon Con);//释放空间 49 50 #endif //_ADDRESS_LIST_H_
Contact.c
1 #define _CRT_SECURE_NO_WARNINGS 1 2 #include"AddressList.h" 3 void judge_full(Pcon Con) //当实际联系人个数和初始化的容量相等时用realloc增容 4 { 5 if (Con->capacity == Con->size) 6 { 7 PerInfo* tmp = (PerInfo*)realloc(Con->data, (Con->capacity + SIZE)*sizeof(PerInfo)); 8 if (tmp == NULL) 9 { 10 printf("out of memery\n"); 11 exit(EXIT_FAILURE); 12 } 13 else 14 { 15 Con->data = tmp; 16 Con->capacity += SIZE; 17 } 18 } 19 } 20 int Find(Pcon Con, char* str) //查找联系人函数 21 { 22 for (int i = 0; i < Con->size; i++) 23 { 24 if (strcmp(str, Con->data[i].name) == 0) 25 { 26 return i; 27 } 28 } 29 return -1;//没有找到返回 -1 30 } 31 void Add(Pcon Con) //添加 32 { 33 judge_full(Con); 34 printf("请输入联系人的姓名 年龄 性别 电话号码,家庭住址\n"); 35 scanf("%s%d%s%s%s", Con->data[Con->size].name, 36 &Con->data[Con->size].age, 37 Con->data[Con->size].sex, 38 Con->data[Con->size].tel, 39 Con->data[Con->size].address); 40 Con->size++; 41 printf("添加成功\n"); 42 return; 43 } 44 void Delete(Pcon Con)//删除联系人 45 { 46 char input[NAME_MAX]; 47 int i = 0; 48 printf("请输入联系人姓名:\n"); 49 scanf("%s", input); 50 int ret = Find(Con, input); 51 if (ret != -1) 52 { 53 for (i = ret; i < Con->size; i++) 54 { 55 Con->data[i] = Con->data[i + 1]; //将所要删除的元素后面的元素都往前移动 56 57 } 58 Con->size--; 59 } 60 else 61 { 62 printf("这个联系人不存在!\n"); 63 } 64 } 65 void Revise(Pcon Con) //修改联系人 66 { 67 char input[NAME_MAX]; 68 printf("请输入联系人姓名:\n"); 69 scanf("%s", input); 70 int ret = Find(Con, input); 71 if (ret != -1) 72 { 73 printf("请输入修改后联系人的姓名,性别,年龄,电话号码,家庭住址\n"); 74 scanf("%s, %s, %d, %s, %s", 75 Con->data[ret].name, 76 Con->data[ret].sex, 77 Con->data[ret].age, 78 Con->data[ret].tel, 79 Con->data[ret].address); 80 printf("修改完成\n"); 81 } 82 else 83 { 84 printf("该联系人不存在\n"); 85 } 86 } 87 void Search(Pcon Con) 88 { 89 char input[NAME_MAX]; 90 printf("请输入联系人姓名:\n"); 91 scanf("%s", input); 92 int ret = Find(Con, input); 93 if (ret != -1) 94 { 95 printf("%s,%s,%d,%s,%s\n", 96 Con->data[ret].name, 97 Con->data[ret].sex, 98 Con->data[ret].age, 99 Con->data[ret].tel, 100 Con->data[ret].address); 101 } 102 else 103 { 104 printf("该联系人不存在!\n"); 105 } 106 } 107 void Display(Pcon Con) 108 { 109 int i = 0; 110 while (i < Con->size) 111 { 112 printf("%s,%s,%d,%s,%s\n", 113 Con->data[i].name, 114 Con->data[i].sex, 115 Con->data[i].age, 116 Con->data[i].tel, 117 Con->data[i].address); 118 i++; 119 } 120 } 121 void Init(Pcon Con) 122 { 123 Con->data = (PerInfo*)malloc(SIZE*sizeof(PerInfo)); //开辟空间 124 if (Con->data == NULL) 125 { 126 printf("out of memory\n"); 127 exit(EXIT_FAILURE); 128 } 129 Con->size = 0; 130 Con->capacity = INIT; 131 Load_Contact(Con); 132 } 133 void Save_Contact(Pcon Con) //存储联系人 134 { 135 FILE* pfwrite = fopen("contact.dat", "w"); 136 if (pfwrite == NULL) 137 { 138 perror("open file for write"); 139 exit(EXIT_FAILURE); 140 } 141 for (int i = 0; i < Con->size; i++) 142 { 143 fwrite(&(Con->data[i]), sizeof(PerInfo), 1, pfwrite); 144 } 145 fclose(pfwrite); 146 } 147 void Load_Contact(Pcon Con)//加载联系人 148 { 149 FILE* pfread = fopen("contact.dat", "r"); 150 PerInfo tmp = { 0 }; 151 if (pfread == NULL) 152 { 153 perror("open file for read"); 154 exit(EXIT_FAILURE); 155 } 156 while (fread(&tmp, 1, sizeof(PerInfo), pfread)) 157 { 158 judge_full(Con); 159 Con->data[Con->size] = tmp; 160 Con->size++; 161 } 162 } 163 void Empty(Pcon Con)//清空联系人 164 { 165 Con->size = 0; 166 return; 167 } 168 void Sort(Pcon Con) //按照联系人姓名进行排序 169 { 170 int flag = 0; 171 for (int i = 0; i < Con->size - 1; i++) //需要排n-1趟 172 { 173 int flag = 0; 174 for (int j = 0; j < Con->size - 1 - i; j++) //每趟进行n-1-i次比较 175 { 176 if (strcmp(Con->data[j].name, Con->data[j + 1].name)>0) //按照升序进行排序 177 { 178 flag = 1; 179 PerInfo tmp = Con->data[j]; 180 Con->data[j] = Con->data[j + 1]; 181 Con->data[j + 1] = tmp; 182 } 183 } 184 if (flag == 0) 185 { 186 break; 187 } 188 } 189 } 190 void Free(Pcon Con) 191 { 192 free(Con->data); 193 Con->data = NULL; 194 195 }
Test.c
1 #define _CRT_SECURE_NO_WARNINGS 1 2 #include"AddressList.h" 3 void Print() 4 { 5 6 printf("**********************************************************\n"); 7 printf("*********1:添加联系人*****2:删除联系人********************\n"); 8 printf("*********3:查找联系人***** 4 : 修改联系人********************\n"); 9 printf("*********5:显示所有联系人***6:排序*************************\n"); 10 printf("*********7:清空联系人********0:退出************************\n"); 11 printf("**********************************************************\n"); 12 } 13 int main() 14 { 15 Contact pcon; 16 Init(&pcon); 17 int input; 18 while (1) 19 { 20 Print(); 21 printf("选择一个操作:"); 22 scanf("%d", &input); 23 switch (input) 24 { 25 case EXIT: 26 Save_Contact(&pcon); 27 Free(&pcon); 28 exit(0); 29 break; 30 case ADD: 31 Add(&pcon); 32 break; 33 case DEL: 34 Delete(&pcon); 35 break; 36 case SEARCH: 37 Search(&pcon); 38 break; 39 case REVISE: 40 Revise(&pcon); 41 break; 42 case SORT: 43 Sort(&pcon); 44 break; 45 case DISPLAY: 46 Display(&pcon); 47 break; 48 case EMPTY: 49 Empty(&pcon); 50 break; 51 default: 52 printf("选择错误,请重新选择:\n"); 53 54 } 55 } 56 system("pause"); 57 return 0; 58 }
---恢复内容结束---
时间: 2024-10-18 18:34:44