------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------
复习的时候本以为文件操作这块很简单,没想到写起来比想象中的难,基础尚不牢固,还需努力
#include <stdio.h>
#include <string.h>
//通讯录界面
void face();
//写入文件
void writeToFile();
//添加联系人
void addContact();
//查看联系人
void checkContact();
//搜索联系人
void searchContact();
//修改联系人
void changeContact();
//删除联系人
void deleteContact();
//联系人结构体
typedef struct {
char name[21];
char telNum[21];
}LXR;
//通讯录临时存储表(上限100个)
LXR List[100];
//通讯录联系人个数
int contactCount=0;
//文件保存地址
char *path = "/Users/Zxx/Desktop/test/List.data";
int main(int argc, const char * argv[]) {
int cho = 0;
while (1) {
face();
scanf("%d",&cho);
if (cho>6||cho<1) {
printf("选择有误请重新选择\n");
}else
switch (cho) {
case 1:
addContact();
break;
case 2:
deleteContact();
break;
case 3:
changeContact();
break;
case 4:
checkContact();
break;
case 5:
searchContact();
break;
case 6:
return 0;
break;
default:
break;
}
}
return 0;
}
/**
* 绘制界面
*/
void face(){
printf("***************************\n");
printf(" 欢迎使用通讯录 \n");
printf(" 1、添加联系人 \n");
printf(" 2、删除联系人 \n");
printf(" 3、修改联系人 \n");
printf(" 4、查看所有联系人 \n");
printf(" 5、搜索联系人 \n");
printf(" 6、退出通讯录 \n");
printf("***************************\n");
}
/**
* 写入通讯录
*/
void writeToFile(){
FILE *fp = fopen(path, "wb");
//如果打开成功则先将联系人个数写入文件头部,在将所有练习人写入文件
if (fp!=NULL) {
fwrite(&contactCount, sizeof(contactCount), 1, fp);
for (int i=0; i<contactCount; i++) {
fwrite(&List[i], sizeof(LXR), 1, fp);
}
}else{
printf("文件打开失败,按任意键退出\n");
getchar();
return;
}
fclose(fp);
}
/**
* 添加联系人
*/
void addContact(){
printf("您选择添加联系人,请输入姓名\n");
scanf("%s",List[contactCount].name);
printf("请输入号码\n");
scanf("%s",List[contactCount].telNum);
//添加联系人,则通讯录联系人个数+1
contactCount++;
writeToFile();
printf("联系人添加成功\n");
}
/**
* 查看联系人
*/
void checkContact(){
FILE *check = fopen(path, "r");
printf("编号\t姓名\t号码\n");
if (check==NULL) {
printf("通讯录为空,请先添加联系人\n");
}else{
//如果通讯录不为空,则先读取联系人个数,再逐个读取联系人并输出
fread(&contactCount, sizeof(contactCount), 1, check);
for (int i=1;i<=contactCount;i++) {
LXR temp;
fread(&temp, sizeof(LXR), 1, check);
printf("%d\t%s\t%s\n",i,temp.name,temp.telNum);
}
}
fclose(check);
}
/**
* 搜索联系人
*/
void searchContact(){
printf("请输入你要搜索的联系人姓名或者号码\n");
char ch[21];
scanf("%s",ch);
int flag=1;
FILE *check = fopen(path, "r");
//读取通讯录联系人个数
fread(&contactCount, sizeof(contactCount), 1, check);
if (check!=NULL) {
//循环遍历通讯录
for (int i=0;i<contactCount;i++) {
LXR temp;
fread(&temp, sizeof(LXR), 1, check);
//将接收的字符串与每个联系人的姓名和电话号码分别比较,若有一个符合,则输出该联系人信息
if(!strcmp(ch, temp.name)||!strcmp(ch, temp.telNum)){
printf("已找到你要查找的人\n姓名\t号码\n%s\t%s\n",temp.name,temp.telNum);
flag = 0;
}
}
}else
printf("你的通讯录为空,请先添加联系人\n");
fclose(check);
if (flag) {
printf("您的通讯录里没有此人\n");
}
}
/**
* 修改联系人
*/
void changeContact(){
checkContact();
FILE *change = fopen(path, "rb+");
if (change!=NULL) {
fread(&contactCount, sizeof(contactCount), 1, change);
printf("请选择你要修改的联系人\n");
int a,flag=0;
LXR temp;
scanf("%d",&a);
if (a<1||a>contactCount) {
printf("选择有误,请从新选择\n");
}else{
printf("请输入姓名\n");
scanf("%s",temp.name);
printf("请输入电话号码\n");
scanf("%s",temp.telNum);
//读取所有联系人的信息
for (int i=0;i<=contactCount;i++) {
fread(&List[i], sizeof(LXR), 1, change);
}
printf("你要用\n%s\t%s\n覆盖\n%s\t%s\n1.确认 .2取消\n",temp.name,temp.telNum,List[a-1].name,List[a-1].telNum);
scanf("%d",&flag);
if (flag==1) {
//将新信息覆盖到旧的信息上
List[a-1] = temp;
writeToFile();
}
}
}
fclose(change);
}
/**
* 删除联系人
*/
void deleteContact(){
checkContact();
printf("请选择你要删除的联系人\n");
int a,flag = 2;
scanf("%d",&a);
FILE *delete = fopen(path, "rb+");
if (delete!=NULL) {
fread(&contactCount, sizeof(contactCount), 1, delete);
for (int i=0;i<=contactCount;i++) {
fread(&List[i], sizeof(LXR), 1, delete);
}
printf("你要删除的是\n%s\t%s\n是否确认删除?\n1.删除\t2.取消\n",List[a-1].name,List[a-1].telNum);
scanf("%d",&flag);
if (flag == 1) {
//将要删除的联系人后面的所有联系人整体前移一位,然后联系人总数减一
for (int j=a; j<contactCount; j++) {
List[j-1]=List[j];
}
contactCount--;
writeToFile();
}
}
fclose(delete);
}