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