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);
}
|