📄 telefon.c
字号:
#include <stdio.h>
#include <string.h>
/* 定义结构体保存订户信息. */
struct subscriber
{
char name[30];
char address[50];
long int telno;
};
addsubs();
modsubs();
delsubs();
querynum();
queryname();
viewdir();
acceptdet();
main()
{
int choice=0;
/* 循环显示菜单,接受用户输入. */
while(choice!=7)
{ printf("\tTELEPHONE DIRECTORY SYSTEM");
printf("\n\n1. Add new subscriber details");
printf("\n2. Modify existing subscriber details");
printf("\n3. Delete existing subscriber details");
printf("\n4. Display subscriber details based on telephone number");
printf("\n5. Display subscriber details based on subscriber name");
printf("\n6. View Directory");
printf("\n7. Quit");
printf("\n\nEnter choice: ");
scanf("%d", &choice);
/* 根据选择调用相应函数 */
if(choice==1)
addsubs();
else if(choice==2)
modsubs();
else if(choice==3)
delsubs();
else if(choice==4)
querynum();
else if(choice==5)
queryname();
else if(choice==6)
viewdir();
else if(choice==7)
exit(0);
else
{ printf("\n\nYou have entered an invalid menu choice. Please reenter.");
getchar();
}
}
}
/* 添加新订户的详细信息 */
addsubs()
{
FILE *fp;
int newfilectr=0, i=0, j, readctr=0;
struct subscriber sub_arr[100], new_sub, temp_sub;
char flag='n';
int size_s=sizeof(struct subscriber);
/* 如果文件存在则以读写模式打开.如果不存在则以写模式打开创建文件. */
if((fp=fopen("telefon.dat", "r+"))==NULL)
{
if((fp=fopen("telefon.dat", "w"))==NULL)
{
printf("\n\nThe telephone directory could not be opened.");
getchar();
return;
}
else
/* 记录文件是新建的文件. */
newfilectr=1;
}
printf("\tADD NEW SUBSCRIBER DETAILS");
getchar();
/* 调用函数接受新的订户信息. */
acceptdet(&new_sub);
if(newfilectr==1) /* 如果为新建文件则直接写信息入文件. */
fwrite(&new_sub, size_s, 1, fp);
else
{
i=0;
/* 循环读文件内容到数组中 */
fread(&sub_arr[i], size_s, 1, fp);
while(!feof(fp))
{
/* 核对新输入的订户姓名是否比数组中的姓名小,找到合适位置则插入. */
if((strcmp(sub_arr[i].name,new_sub.name))>=0 && flag=='n')
{
temp_sub=sub_arr[i];
sub_arr[i]=new_sub;
i++;
sub_arr[i]=temp_sub;
flag='y';
}
i++;
fread(&sub_arr[i], size_s, 1, fp);
}
/* 如果新订户名大于所有订户名,则把新输入信息添加到数组末尾. */
if(flag=='n')
{
sub_arr[i]=new_sub;
i++;
}
rewind(fp);
/* 写数组内容到文件. */
for(j=0; j<i; j++)
fwrite(&sub_arr[j], size_s, 1, fp);
}
printf("\n\n\tSubscriber details have been added");
getchar();
fclose(fp);
}
/* Function that accepts the new or modified details of a subscriber. */
acceptdet(struct subscriber *accsub)
{
char check;
check='n';
/*输入姓名,不许为空 */
while(check=='n')
{
printf("\n\nEnter Subscriber name (upto 30 chars.): ");
gets(accsub->name);
if((strlen(accsub->name))==0)
printf("\n\tSubscriber name must be entered.");
else
check='y';
}
check='n';
/* 输入地址,不许为空 */
while(check=='n')
{
printf("\n\nEnter Subscriber address (upto 50 chars.): ");
gets(accsub->address);
if((strlen(accsub->address))==0)
printf("\n\tSubscriber address must be entered.");
else
check='y';
}
check='n';
/* 确认输入的电话号码在4000000和4999999之间. */
while(check=='n')
{
printf("\n\nEnter telephone number: ");
scanf("%ld", &accsub->telno);
if(accsub->telno<4000000 || accsub->telno>4999999)
printf("\n\tSubscriber telephone number must be between 4000000 and 4999999");
else
check='y';
}
}
/* 修改现有订户的详细信息. */
modsubs()
{
FILE *fp;
struct subscriber sub_arr[100], new_sub, temp_sub, match_sub;
char vname[30], flag, flag1;
int i, j;
int size_s=sizeof(struct subscriber);
/* 如果文件存在则以读写模式打开,如果不存在,提示用户 */
if((fp=fopen("telefon.dat", "r+"))==NULL)
{
printf("\n\nThe telephone directory could not be opened.");
getchar();
return;
}
printf("\tMODIFY SUBSCRIBER DETAILS");
/* 输入订户姓名以确定需要修改的记录. */
printf("\n\nEnter Subscriber name (upto 30 chars.): ");
getchar();
gets(vname);
i=0;
flag='n';
/* 从文件中读第一个记录. */
fread(&temp_sub, size_s, 1, fp);
/* 循环读取直到文件结束. */
while(!feof(fp))
{
/* 检查读取的记录是否需要修改. */
if((strcmp(temp_sub.name,vname))==0)
{
/*如果找到需要修改的记录,则保存到结构体变量中. */
match_sub=temp_sub;
flag='y';
}
else
{
sub_arr[i]=temp_sub;
i++;
}
fread(&temp_sub, size_s, 1, fp);
}
if(flag=='n')
{
printf("\n\n\tSubscriber details not found");
getchar();
}
else
{
/* 显示找到的需要修改的记录. */
printf("\n\tRECORD TO BE MODIFIED");
printf("\n\nName=%s\nAddress=%s\nTelephone number=%ld", match_sub.name, match_sub.address, match_sub.telno);
printf("\n\nENTER NEW RECORD DETAILS");
/* 调用函数输入修改的数据. */
acceptdet(&new_sub);
rewind(fp);
for(j=0, flag1='n'; j<i;)
{
if((strcmp(sub_arr[j].name,new_sub.name))>=0 && flag1=='n')
{
/* 写修改的记录到文件. */
fwrite(&new_sub, size_s, 1, fp);
flag1='y';
}
else
{
fwrite(&sub_arr[j], size_s, 1, fp);
j++;
}
}
/* 如果修改后的订户姓名大于其他所有记录,则写入文件末尾. */
if(flag1=='n')
{
fwrite(&new_sub, size_s, 1, fp);
}
printf("\n\n\tSubscriber details have been modified");
getchar();
}
fclose(fp);
}
/* 删除现有订户的详细信息. */
delsubs()
{
FILE *fp;
struct subscriber sub_arr[100], temp_sub, match_sub;
char vname[30], flag;
int i, j;
int size_s=sizeof(struct subscriber);
if((fp=fopen("telefon.dat", "r"))==NULL)
{
printf("\n\nThe telephone directory could not be opened for reading.");
getchar();
return;
}
printf("\tDELETE SUBSCRIBER DETAILS");
/* 输入要删除的订户姓名. */
printf("\n\nEnter Subscriber name (upto 30 chars.): ");
getchar();
gets(vname);
i=0;
flag='n';
fread(&temp_sub, size_s, 1, fp);
while(!feof(fp))
{
/* 查找需删除的记录 */
if((strcmp(temp_sub.name,vname))==0)
{
match_sub=temp_sub;
flag='y';
}
else
{
/* 存储不匹配的记录到数组中 */
sub_arr[i]=temp_sub;
i++;
}
fread(&temp_sub, size_s, 1, fp);
}
if(flag=='n') //未找到则提示
{
printf("\n\n\tSubscriber details not found");
getchar();
}
else//显示被删除的记录
{
printf("\n\tRECORD BEING DELETED");
printf("\n\nName=%s\nAddress=%s\nTelephone number=%ld", match_sub.name, match_sub.address, match_sub.telno);
fclose(fp);
/* 以写模式打开文件,写入数据. */
if((fp=fopen("telefon.dat", "w"))==NULL)
{
printf("\n\nThe telephone directory could not be opened for writing.");
getchar();
return;
}
for(j=0; j<i;j++)
{
fwrite(&sub_arr[j], size_s, 1, fp);
}
printf("\n\n\tSubscriber details have been deleted");
getchar();
}
fclose(fp);
}
/* 显示根据电话号码查出的订户详细信息 */
querynum()
{
FILE *fp;
struct subscriber temp_sub;
char flag;
long int vtelno;
int size_s=sizeof(struct subscriber);
if((fp=fopen("telefon.dat", "r"))==NULL)
{
printf("\n\nThe telephone directory could not be opened for reading.");
getchar();
return;
}
printf("\tVIEW SUBSCRIBER DETAILS");
/* 输入电话号码. */
printf("\n\nEnter telephone number: ");
scanf("%ld", &vtelno);
flag='n';
fread(&temp_sub, size_s, 1, fp);
while(!feof(fp))
{
/* 核对读取的电话号码是否和输入的号码匹配. */
if(temp_sub.telno==vtelno)
{
/* 如果号码匹配,设置标记并跳出循环. */
flag='y';
break;
}
fread(&temp_sub, size_s, 1, fp);
}
if(flag=='n') /* 如果未找到匹配的电话号码则提示. */
{
printf("\n\n\tSubscriber details not found");
getchar();
}
else
{
printf("\n\tREQUESTED SUBSCRIBER DETAILS");
printf("\n\nName: %s\nAddress: %s\nTelephone number: %ld", temp_sub.name, temp_sub.address, temp_sub.telno);
getchar();
}
fclose(fp);
}
/* 显示根据订户名查出的订户详细信息. */
queryname()
{
FILE *fp;
struct subscriber temp_sub;
char flag, vname[30];
int size_s=sizeof(struct subscriber);
if((fp=fopen("telefon.dat", "r"))==NULL)
{
printf("\n\nThe telephone directory could not be opened for reading.");
getchar();
return;
}
printf("\tVIEW SUBSCRIBER DETAILS");
/* 接收订户名的输入. */
printf("\n\nEnter Subscriber name: ");
getchar();
gets(vname);
flag='n';
fread(&temp_sub, size_s, 1, fp);
while(!feof(fp))
{
/* 输入的名字是否和读取的名字相匹配. */
if((strcmp(temp_sub.name,vname))==0)
{
flag='y';
break;
}
fread(&temp_sub, size_s, 1, fp);
}
if(flag=='n') /* 未找到匹配名字. */
{
printf("\n\n\tSubscriber details not found");
getchar();
}
else
{
printf("\n\tREQUESTED SUBSCRIBER DETAILS");
printf("\n\nName: %s\nAddress: %s\nTelephone number: %ld", temp_sub.name, temp_sub.address, temp_sub.telno);
getchar();
}
fclose(fp);
}
/*查看目录. */
viewdir()
{
FILE *fp;
struct subscriber viewsub;
int i=0;
int size_s=sizeof(struct subscriber);
if((fp=fopen("telefon.dat", "r"))==NULL)
{
printf("\n\nThe telephone directory could not be opened.");
getchar();
return;
}
fread(&viewsub, size_s, 1, fp);
while(!feof(fp))
{
i++;
printf("\nRecord %d\t%s\t%s\t%ld", i, viewsub.name, viewsub.address, viewsub.telno);
fread(&viewsub, size_s, 1, fp);
}
getchar();
fclose(fp);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -