2)Contact.c 文件主要用来实现声明的函数和初始化全局变量- //
- // Contact.c
- // ContactDemo
- //
- // Created by amos on 10/2/15.
- // Copyright (c) 2015 augmentum. All rights reserved.
- //
- #include <stdio.h>
- #include <string.h>
- #include "Contact.h"
- //定义并初始化联系人保存的文件名
- char *filePath = "contactList.data";
- //定义并初始化联系人的总个数
- int totalContacts = 0;
- /**
- * 增加联系人
- */
- void doAdd(){
-
- printf("增加联系人!\n");
-
- printf("请输入联系人姓名(不要有空格):");
- scanf("%s", list[totalContacts].name);
- printf("请输入联系人电话号码(不要有空格):");
- scanf("%s", list[totalContacts].phoneNumber);
- //自动给该联系人编号
- list[totalContacts].num = totalContacts;
-
- totalContacts++;
- doWriteToFile(list, -2);
- }
- /**
- * 删除联系人
- */
- void doDelete(char name[]){
- //修改之前先打印该联系人的信息
- int num = doSearchByName(name);
-
- if (-1 == num) {
- return;
- }
-
- printf("确定要删除吗(y/n)");
-
- char ch = getchar();
-
- while (ch == '\n') {
- ch = getchar();
- }
- getchar();
- //如果输入了Y那么执行删除
- if ('y' == ch || 'Y' == ch) {
- doWriteToFile(list, num);
- }
- }
- /**
- * 修改联系人
- */
- void doUpdateByName(char name[]){
- //修改之前先打印该联系人的信息
- int num = doSearchByName(name);
-
- if (-1 == num) {
- return;
- }
-
- printf("请输入联系人姓名(不要有空格):");
- scanf("%s", list[num].name);
- printf("请输入联系人电话号码(不要有空格):");
- scanf("%s", list[num].phoneNumber);
- doWriteToFile(list, -2);
- }
- /**
- * 根据姓名查询联系人,返回联系人的编号
- */
- int doSearchByName(char name[]){
- int num = -1;
- doGetAllInfo();
-
- if (0 == totalContacts) {
- printf("没有该联系人....");
- return -1;
- }
-
- for (int i = 0; i < totalContacts; i++) {
- if (strcmp(list[i].name, name) == 0) {
- num = i;
- printf("编号\t|\t姓名\t|\t电话号码\n");
- printf("%d\t|\t%s\t|\t%s\n", list[i].num, list[i].name, list[i].phoneNumber);
- break;
- }
- }
-
- if (-1 == num) {
- printf("没有该联系人....");
- }
-
- return num;
- }
- /**
- * 显示所有联系人的信息
- */
- void doShowAllInfo(){
-
- //显示信息之前,先从文件中获取所有联系人的信息
- doGetAllInfo();
-
- if (0 == totalContacts) {
- printf("暂无联系人,请添加联系人....");
- return;
- }
-
- printf("编号\t|\t姓名\t|\t电话号码\n");
- for (int i = 0; i < totalContacts; i++) {
- printf("%d\t|\t%s\t|\t%s\n", list[i].num, list[i].name, list[i].phoneNumber);
- }
- }
- /**
- * 显示功能选项
- */
- void doShowMenu(){
-
- //打印菜单
- printf("\n\n*****************菜 单******************\n");
- printf("**** 1、显示所有联系人信息 ****\n");
- printf("**** 2、根据名字查询联系人信息 ****\n");
- printf("**** 3、修改联系人信息 ****\n");
- printf("**** 4、增加联系人 ****\n");
- printf("**** 5、删除联系人 ****\n");
- printf("**** 6、退出系统 ****\n");
- printf("\n请选择用数字选择功能:");
- }
- /**
- * 退出系统
- */
- void doExitSystem(){
- printf("正在退出系统.......");
- exit(0);
- }
- /**
- * 选择功能:根据用户输入的选项调用相应的功能
- */
- void doSwitchFunction(char operation){
- char name[NAME_LEN];
- switch (operation) {
- case '1':
- doShowAllInfo();
- break;
- case '2':
-
- printf("请输入要查询的联系人姓名(不要有空格):");
- scanf("%s", name);
- doSearchByName(name);
- break;
- case '3':
- printf("请输入要更新的联系人姓名(不要有空格):");
- scanf("%s", name);
- doUpdateByName(name);
- break;
- case '4':
- doAdd();
- break;
- case '5':
- printf("请输入要删除的联系人姓名(不要有空格):");
- scanf("%s", name);
- doDelete(name);
- break;
- case '6':
- doExitSystem();
- break;
- case '\n':
- break;
- default:
- printf("\n请输入1~6 之间的数字选择功能!\n");
- }
- }
- /**
- * 写入联系人信息到文件中
- */
- void doWriteToFile(Contact list[], int num){
-
- //以二进制的方式写入到文件中
- FILE *fp = fopen(filePath, "wb");
-
- //每次写入一个contact信息,每次写1块
- //1、先把联系人个数写入到文件中
-
-
- //2、依次写入联系人信息
- //如果num不等于-2说明是来自于删除操作,此时要更新每个联系人的编号
- if (num != -2) {
- int tempCount = totalContacts--;//删除一个联系人,因此总个数减1
- fwrite(&totalContacts, sizeof(tempCount), 1, fp);
- totalContacts = 0; //将totalContacts重置,用于重新编号
-
- for (int i = 0 ; i < tempCount; i++) {
-
- if(num == i)//不再保存要删除的联系人
- {
- continue;
- }
-
- list[i].num = totalContacts;//更新联系人编号
- fwrite(&list[i], sizeof(Contact), 1, fp);
- }
- printf("删除成功!");
- }
- else{
- fwrite(&totalContacts, sizeof(totalContacts), 1, fp);
- for (int i = 0 ; i < totalContacts; i++) {
-
- fwrite(&list[i], sizeof(Contact), 1, fp);
- }
- printf("保存成功!");
- }
-
- fclose(fp);
-
- }
- /**
- * 从文件中获取所有联系人信息到联系人列表中
- */
- void doGetAllInfo(){
- FILE *fp = fopen(filePath, "r");
-
- if (NULL == fp) {
- totalContacts = 0;
- return;
- }
- //先读取出联系人总个数
- fread(&totalContacts, sizeof(totalContacts), 1, fp);
-
- if (0 == totalContacts) {
- return;
- }
- //再依次取出联系人信息
- for (int i = 0; i < totalContacts; i++) {
- fread(&list[i], sizeof(Contact), 1, fp);
- }
- fclose(fp);
- }
- 3)main.c文件是程序主循环入口
- //
- // main.c
- // ContactDemo
- //
- // Created by amos on 10/2/15.
- // Copyright (c) 2015 augmentum. All rights reserved.
- //
- #include <stdio.h>
- #include "Contact.h"
- int main(int argc, const char * argv[])
- {
- //定义用户选择的功能选项
- char operation = '0';
-
- //1、开始系统
-
- doShowMenu();
- while (operation != 6){
-
- operation = getchar();
- if ('\n' == operation) {
- continue;
- }
-
- getchar();//用于吸收多余的回车符
- //根据用户选择切换要使用的功能
- doSwitchFunction(operation);
- doShowMenu();
- }
-
- return 0;
- }
复制代码
|
|