1、修改了往文件里存储和从文件里都出来的过程。使用了fread,fwrite.
2、注意fread和fwrite使用时,若数据块是结构体,则结构体中的指针域也将被写进文件或从文件中读出。
/**************************************
电子通讯录:
内容:序号,姓名,电话,住址。
功能:添加好友、删除好友、清空联系人、好友排序、搜索好友、显示所有联系人。
添加好友:如果重名,可选择覆盖或新建。
好友排序:可选择按姓氏正序排或逆序排。
删除好友:若遇到重名好友,则按序号删除。
****************************************/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
typedef structPeople{
char ID[20]; //序号
char name[20]; //姓名
char phone[20]; //号码
char add[20]; //住址
struct People *next;
}List;
/********主界面**********/
int menu()
{
int choice;
printf("\n");
printf("0----添加好友\n");
printf("1----显示好友列表\n");
printf("2----搜索好友\n");
printf("3----删除好友\n");
printf("4----好友排序\n");
printf("5----清空联系人\n");
printf("6----保存联系人至文件\n");
printf("7----读取文件中联系人\n");
printf("8----退出\n");
scanf("%d",&choice);
return choice;
}
//添加联系人
void Add(List*people)
{
List *p,*r;
r = people;
p = (List *)malloc(sizeof(List));
printf("请输入序号:\n");
scanf("%s",p->ID);
printf("请输入姓名:\n");
scanf("%s",p->name);
printf("请输入电话:\n");
scanf("%s",p->phone);
printf("请输入地址:\n");
scanf("%s",p->add);
while(r->next != NULL)
{
r = r->next;
}
r->next = p;
p->next = NULL;
printf("\n添加成功!\n");
}
//显示
void Display(List*people)
{
List *p;
p = people->next;
printf("好友列表:\n");
printf("序号\t\t姓名\t\t电话\t\t住址\n");
while(p != NULL)
{
printf("%s\t\t",p->ID);
printf("%s\t\t",p->name);
printf("%s\t\t",p->phone);
printf("%s\t\t",p->add);
p = p->next;
printf("\n");
}
}
//搜索好友
void Search(List*people)
{
List *p;
char name[10]; //搜索人的姓名
p = people->next;
if(p != NULL)
{
printf("请输入要搜索人的姓名:\n");
scanf("%s",name);
while(p != NULL)
{
if(strcmp(p->name,name) == 0)
{
printf("%s ",p->ID);
printf("%s ",p->name);
printf("%s ",p->phone);
printf("%s ",p->add);
printf("\n");
}
p = p->next;
}
}
else
{
printf("联系人为空,无法搜索!\n");
}
}
//删除联系人
void Delete(List*people)
{
char name[10];
List *p,*r;
int count = 0;
char ID[10];
p = people->next;
if(p != NULL)
{
printf("\n请输入要删除人的姓名:\n");
scanf("%s",name);
while(p != NULL)
{
if(strcmp(p->name,name) == 0)
{
count++;
}
p = p->next;
}
if(count == 1)
{
p = people;
r = people->next;
while(r != NULL)
{
if(strcmp(r->name,name) ==0)
{
p->next = r->next;
break;
}
p = p->next;
r = r->next;
}
}
if(count > 1)
{
r = people->next;
while(r != NULL)
{
if(strcmp(r->name,name) ==0)
{
printf("%s %s %s%s\n",r->ID,r->name,r->phone,r->add);
}
r = r->next;
}
printf("请选择序号删除;\n");
scanf("%s",ID);
p = people;
r = people->next;
while(r != NULL)
{
if(strcmp(r->ID,ID) == 0)
{
p->next = r->next;
r = p->next;
}
else
{
p = p->next;
r = r->next;
}
}
}
printf("删除成功!\n");
}
else
{
printf("联系人为空,无法删除!\n");
}
}
//排序
void Sort(List*people)
{
List *pre,*p,*tail,*temp;
tail = NULL;
p = people->next;
if(p != NULL)
{
while(tail != people->next->next)
{
pre = people;
p = people->next;
while(p->next != tail)
{
if(strcmp(p->name,p->next->name) == 1)
{
pre->next = p->next;
p->next =pre->next->next;
pre->next->next = p;
p = pre->next;
}
pre = pre->next;
p = p->next;
}
tail = p;
}
printf("排序成功!\n");
}
else
{
printf("联系人为空,无法排序!\n");
}
}
//清空联系人
void Clear(List*people)
{
List *p,*q;
p = people->next;
if(p != NULL)
{
while(p != NULL)
{
q = p->next;
free(p);
p = q;
}
people->next = NULL;
printf("清空成功!\n");
}
else
{
printf("联系人为空!\n");
}
}
//将联系人保存至文件
void FileSave(List*people)
{
List *p;
FILE *F;
p = people->next;
F =fopen("ContactList.c","w"); //打开一个文件,没有则创建
if(F == NULL) //打开失败
{
printf("打开文件失败!\n");
exit(1);
}
while(p != NULL)
{
fwrite(p,sizeof(List),1,F);
p = p->next;
}
printf("存储成功!\n");
fclose(F);
}
//将文件中的数据读出来,并放到一个链表中
void FileRead(List*people, FILE *F)
{
List *q,*r; //用来创建新的节点,存放读取的信息
int num;
r = people;
F =fopen("ContactList.c","r");
if(fgetc(F) == EOF) //判断文件中是否有内容
{
printf("读取失败,文件中无内容!\n");
}
else
{
fseek(F,0,SEEK_SET);
while(1)
{
q = (List *)malloc(sizeof(List));
num = fread(q,sizeof(List),1,F);
if(num < 1)
{
free(q);
break;
}
r->next = q;
q->next = NULL;
r = r->next;
}
printf("读取成功!\n");
}
fclose(F);
}
//主函数
int main()
{
int choice;
List people;
FILE *F;
people.next = NULL;
while(1)
{
choice = menu();
switch(choice)
{
case 0: Add(&people);
break;
case 1: Display(&people);
break;
case 2: Search(&people);
break;
case 3: Delete(&people);
break;
case 4: Sort(&people);
break;
case 5: Clear(&people);
break;
case 6: FileSave(&people);
break;
case 7: FileRead(&people,F);
break;
case 8: exit(1);
default: printf("\n无效指令,请重新输入!\n");
break;
}
}
return 0;
}