C语言运用文件和结构体的一个例子(简易通讯录的实现)
/*:
1.该程序建立一个通讯录文件,可存放有姓名、电话号码、住址信息,
并且有通信录输出、查找、添加、修改及删除功能。
2.请先阅读程序,依照现有函数,完成modify()和output()函数。
3.本程序缺陷,通讯录保存信息较简单;另外,每次运行程序,都重新建立通信录;
请修改程序,增加email地址信息;修改程序,使之可以对现有通信录文件操作。
*/
#include
#include
struct person
{
char name[8];
char tel[15];
...
/*:
1.该程序建立一个通讯录文件,可存放有姓名、电话号码、住址信息,
并且有通信录输出、查找、添加、修改及删除功能。
2.请先阅读程序,依照现有函数,完成modify()和output()函数。
3.本程序缺陷,通讯录保存信息较简单;另外,每次运行程序,都重新建立通信录;
请修改程序,增加email地址信息;修改程序,使之可以对现有通信录文件操作。
*/
#include
#include
struct person
{
char name[8];
char tel[15];
char addr[50];
char em[20];
};
//filename数组存放通信录文件名
char filename[25];
FILE *fp;
//主要函数原型声明
void creat();
void output();
void search();
void append();
void modify();
void delete();
void exit();
main()
{
int m;char k;
printf("\n请输入你要打开的通讯录文件名:");
gets(filename);
if((fp=fopen(filename,"r"))==NULL)
{
printf("\n当前没有此通讯录文件,现在是否执行创建(Y/N)?:");
scanf("%c",&k);getchar();//用于接收输入后的回车键,下边的delete函数同理
while(k!='Y'&&k!='N'&&k!='y'&&k!='n')
{printf("\n输入有误,请再次输入一个值:");scanf("%c",&k);getchar();}
if(k=='Y'||k=='y') {creat();}//当选择了Y或y时执行创建函数
else if(k=='N'||k=='n')
{printf("\n由于你选择了退出,现在程序即将关闭!\n");exit();}
}
else
//当文件存在时把通讯录信息输出,并且提示操作
{
printf("\n你要打开的通讯录文件%s已存在,现在可直接对其操作*^_^*\n",filename);
printf("\n通讯录文件%s现已有的通讯信息:\n",filename);output();
printf("\n请根据提示选择1~5对通讯录文件进行操作*^_^*\n");
}
while(1)
{
printf("\n添加,请按1");
printf("\n查找,请按2");
printf("\n修改,请按3");
printf("\n删除,请按4");
printf("\n输出,请按5");
printf("\n退出,请按0\n");
printf("请输入数字1~5:");
scanf("%d",&m);getchar();
while(m<0||m>5)
{printf("\n抱歉,您输入的值不是1~5的数字^@@^,请再次输入:");scanf("%d",&m);getchar();}
if(m>=0&&m<=5)
{
switch(m)
{
case 1: append();break;
case 2: search();break;
case 3: modify();break;
case 4: delete();break;
case 5: output();break;
case 0: exit();
}
printf("\n操作完毕,请再次选择!\n");
}
}
}
/*建立通信录函数creat():功能:建立通信录文件,并连续输入记录,以0结束输入*/
void creat()
{
struct person one;
if((fp=fopen(filename,"w"))==NULL)
{
printf("\n不能建立通讯簿!");
exit();
}
printf("\n成功创建%s通讯录文件,请按提示进行操作*^_^*\n",filename);
fprintf(fp,"%-10s%-20s%-25s%-25s\n","姓名","电话号码","住址","电子邮件");
printf("\n请输入每个成员的姓名、电话号码、住址和电子邮件(当成员名是0时结束输入):\n");
scanf("%s",one.name);
while(strcmp(one.name,"0"))
//当输入的名字不为“0”的时候,执行循环,当名字为“0”时,退出循环
{
scanf("%s%s%s",one.tel,one.addr,one.em);
fprintf(fp,"%-10s%-20s%-25s%-25s\n",one.name,one.tel,one.addr,one.em);
//把输入的信息按指定格式写入文件当中
scanf("%s",one.name);
}
fclose(fp);
}
/*输出函数output();通信录中所有通信记录,每行输出一条记录*/
void output()
{
struct person one;
if((fp=fopen(filename,"r"))==NULL)
{
printf("\n不能打开通讯簿!");
exit();
}
printf("\n\n%40s\n","< 通 讯 簿 >");
while(!feof(fp))//当文件未结束时,逐条读取文件信息并输出
{
fscanf(fp,"%s%s%s%s\n",one.name,one.tel,one.addr,one.em);
printf("%-10s%-20s%-25s%-25s",one.name,one.tel,one.addr,one.em);
}
fclose(fp);
}
/*通讯录添加函数*/
void append()
{
struct person one;
if((fp=fopen(filename,"a"))==NULL)
{
printf("\n不能打开通讯簿!");
exit();
}
printf("\n请输入添加的姓名:");
scanf("%s",one.name);
printf("请输入电话号码:");
scanf("%s",one.tel);
printf("请输入住址:");
scanf("%s",one.addr);
printf("请输入电子邮件:");
scanf("%s",one.em);
fprintf(fp,"%-10s%-20s%-25s%-25s\n",one.name,one.tel,one.addr,one.em);
printf("\n你添加的信息:\n");
printf("%-10s%-20s%-25s%-25s\n","姓名","电话号码","住址","电子邮件");
printf("%-10s%-20s%-25s%-25s\n",one.name,one.tel,one.addr,one.em);
fclose(fp);
}
/*通讯录查找函数*/
void search()
{
int flag=0;
char namekey[8];
struct person one;
printf("\n请输入你要查找的姓名:");
scanf("%s",namekey);
if((fp=fopen(filename,"rb"))==NULL)
{
printf("\n不能打开通讯簿!");
exit();
}
while(!feof(fp))
{
fscanf(fp,"%s%s%s%s\n",one.name,one.tel,one.addr,one.em);
if(!strcmp(namekey,one.name))
{
printf("\n已查到,记录为:");
printf("\n%-10s%-18s%-25s%-25s",one.name,one.tel,one.addr,one.em);
flag=1;
}
}
if(!flag)
printf("\n对不起,通讯簿中没有此人的记录。");
fclose(fp);
}
/*通讯录个人信息修改函数*/
void modify()
{
int flag=0;
long offset;
char namekey[8];
struct person one;
printf("\n请输入姓名:");
scanf("%s",namekey);
if((fp=fopen(filename,"r+"))==NULL)
{
printf("\n不能打开通讯簿!");
exit();
}
while(!feof(fp))
{
offset=ftell(fp);//把文件位置指针的当前值赋给offset
fscanf(fp,"%s%s%s%s\n",one.name,one.tel,one.addr,one.em);
if(!strcmp(namekey,one.name)) {flag=1;break;}
}
if(flag)
{
printf("已查到,当前修改在通讯录的第%ld位,记录为:",(ftell(fp)/(sizeof(struct person))));
//把通讯人的位置显示出来
printf("\n%-10s%-18s%-25s%-25s",one.name,one.tel,one.addr,one.em);
printf("\n请输入新姓名、电话号码及住址:\n");
scanf("%s%s%s%s",one.name,one.tel,one.addr,one.em);
fseek(fp,offset,SEEK_SET);
//改变文件位置指针的位置,其中SEEK_SET代着0,即是把文件位置指针指到所找到的通讯人处
fprintf(fp,"%-10s%-20s%-25s%-25s\n",one.name,one.tel,one.addr,one.em);
//把新的通讯录信息输入文件当中
}
else
printf("\n对不起,通讯簿中没有此人的记录。");
fclose(fp);
}
/*通讯录个人信息删除函数*/
void delete()
{
int k=0;char m;
long offset;
char namekey[8];
struct person one;
printf("\n请输入姓名:");
scanf("%s",namekey);
if((fp=fopen(filename,"r+"))==NULL)
{
printf("\n不能打开通讯簿!");
exit();
}
while(!feof(fp))
{
offset=ftell(fp);
fscanf(fp,"%s%s%s%s\n",one.name,one.tel,one.addr,one.em);
if(!strcmp(namekey,one.name)) {k=1;break;}
}
if(k)
{
printf("\n已查到,将要删除的记录为:");
printf("\n%-10s%-18s%-25s%-25s",one.name,one.tel,one.addr,one.em);
printf("\n确实要删除?(Y/N):");
getchar();scanf("%c",&m);
while(m!='Y'&&m!='N'&&m!='y'&&m!='n')
{printf("\n选择有误,请重新输入新的值:");getchar();scanf("%c",&m);}
if(m=='Y'||m=='y')
{
fseek(fp,offset,SEEK_SET);fprintf(fp,"%-10s%-20s%-25s%-25s\n","","","","");
//把空信息输入,替代原有的信息,以达到删除的目的
printf("\n已经把记录删除掉*Y_Y*\n");
}
else if(m=='n'||m=='N')
{printf("\n谢谢天,谢谢地,你居然没有删我*@@*\n");}
}
else
printf("\n对不起,通讯簿中没有此人的记录。");
fclose(fp);
}
本文档为【C语言运用文件和结构体的一个例子(简易通讯录的实现)】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。