本示例充分利用前期所学一些C语言编程知识,主要涉及到的有:结构体,文件的读写等。本通讯录设定可以保存100条通讯录,每条通讯录包括:姓名,街道,城市,国家,邮编。程序运行后,显示一个主菜单:
1、添加联系人
2、删除联系人
3、显示所有联系人
4、保存联系人条目到文件
5、从文件读取联系人条目
6、退出
#include <stdio.h>
#include <stdlib.h>
//定义本通讯录最大容量为100条
#define MAX 100
//结构体,用以存储通讯录的具体信息
struct addr {
char name[50];
char street[50];
char city[50];
char state[20];
unsigned long int zip;
} addr_list[MAX];
//后文将会用到的若干子程序
void init_list(void);
void enter(void);
void delete(void);
void list(void);
void load(void);
void save(void);
int menu_select(void);
void find_free(void);
//主程序
int main(void)
{
char choice;
//初始化通讯录结构体,将所有字段都置为空
init_list();
//空的for语句构成一个无限循环,显示主菜单提示用户输入并执行对应的操作
for(;;) {
choice = menu_select();
switch(choice) {
case 1: enter();
break;
case 2: delete();
break;
case 3: list();
break;
case 4: save();
break;
case 5: load();
break;
case 6: exit(0);
}
}
return 0;
}
//初始化通讯录,将所有条目的name字段都设为“\0”
void init_list(void)
{
register int t;
for(t=0; t<MAX; ++t) addr_list[t].name[0] = '\0';
}
//获取用户从键盘的一个输入项,返回值是1-6之间的一个数
int menu_select(void)
{
char s[80];
int c;
printf("1. Enter a name\n");
printf("2. Delete a name\n");
printf("3. List the file\n");
printf("4. Save the file\n");
printf("5. Load the file\n");
printf("6. Quit\n");
do {
printf("\nEnter your choice: \n");
gets(s);
c = atoi(s);
} while(c<0 || c>6);
return c;
}
//输入一个通讯录的条目
void enter(void)
{
int slot;
char s[80];
slot = find_free();
if(slot==-1) {
printf("\nList Full");
return;
}
printf("Enter name: ");
gets(addr_list[slot].name);
printf("Enter street: ");
gets(addr_list[slot].street);
printf("Enter city: ");
gets(addr_list[slot].city);
printf("Enter state: ");
gets(addr_list[slot].state);
printf("Enter zip: ");
gets(s);
addr_list[slot].zip = strtoul(s, '\0', 10);//
}
//搜寻一个空白的条目
int find_free(void)
{
register int t;
for(t=0; addr_list[t].name[0] && t<MAX; ++t) ;
if(t==MAX)
return -1; //到达MAX则本通讯录所有条目已经耗尽,没有空白了
return t;
}
//删除一个通讯录条目
void delete(void)
{
register int slot;
char s[80];
printf("enter record #: ");
gets(s);
slot = atoi(s);
if(slot>=0 && slot < MAX)
addr_list[slot].name[0] = '\0';
}
//在屏幕上显示所有的通讯录条目
void list(void)
{
register int t;
for(t=0; t<MAX; ++t) {
if(addr_list[t].name[0]) {
printf("%s\n", addr_list[t].name);
printf("%s\n", addr_list[t].street);
printf("%s\n", addr_list[t].city);
printf("%s\n", addr_list[t].state);
printf("%lu\n\n", addr_list[t].zip);
}
}
printf("\n\n");
}
//将内存中的通讯录保存到磁盘
void save(void)
{
FILE *fp;
register int i;
if((fp=fopen("maillist", "wb"))==NULL) {
printf("Cannot open file.\n");
return;
}
for(i=0; i<MAX; i++)
if(*addr_list[i].name)
if(fwrite(&addr_list[i],
sizeof(struct addr), 1, fp)!=1)
printf("File write error.\n");
fclose(fp);
}
//从磁盘文件里读取保存的通讯录条目信息
void load(void)
{
FILE *fp;
register int i;
if((fp=fopen("maillist", "rb"))==NULL) {
printf("Cannot open file.\n");
return;
}
init_list();
for(i=0; i<MAX; i++)
if(fread(&addr_list[i],
sizeof(struct addr), 1, fp)!=1) {
if(feof(fp)) break;
printf("File read error.\n");
}
fclose(fp);
}