通讯录管理
需求分析:
改程序具有一个菜单,便于用户完成如下操作:
A. 向文件中增加记录;
B 显示文件中所有记录;
C 修改任意一个记录;
D 按照姓名查找一个同学的记录
E 删除某个同学的记录;
编写代码如下:
//*********************************************************************************************
// 建立一个学生通讯录管理系统
// 主要功能包括:能建立、修改和增删学生通讯录,能够按多种方式进行查询。
//*********************************************************************************************
#include <iostream>
#include <winsock2.h>
#include <fstream>
#include <conio.h>
#include <cstdlib>
#include <string>
using namespace std;
const char filename[]="address.dat"; // 存储同学通讯录的文件
struct addresslist
{
char name[21]; //存储姓名
char address[51]; //存储地址
char phone[14]; //存储电话
char email[51]; //存储电子邮箱
int age; //存储年龄
}
//函数声明
bool openfile(fstream & ); //打开同学录文件
int menu(); //显示主菜单
void add(fstream & ); //添加记录信息
void modify(fstream & ); //修改记录信息
void del(fstream & ); //删除记录信息
void find(fstream & ); //查找记录信息
void display(fstream & ); //显示记录信息
int findrecord(fstream &,const char*); // 按姓名查找一条记录
int getamount(fstream & ); //获取记录数量
int main()
{
bool exit=false //判断用户是否想退出程序
fstream listfile //流对象
lsitfile.open(filename,ios::in|ios::out|ios::binary|ios::trunc);
if (listfile.fail()) //无法打开文件
{
cout<<"打开文件错误,无法打开文件!"<<endl;
exit(1);
}
while(!exit)
{
switch(menu())
{
case 1:
add(listfile);
break;
case 2:
modify(listfile);
break;
case 3:
del(listfile);
break;
case 4:
find(listfile);
break;
case 5:
display(listfile);
break;
case 6:
exit=true;
break;
}
}
listfile.close();
return 0;
}
//打开通讯录文件
//返回值:如果文件打开成功则返回值为true,否则返回false。
bool openfile(fstream &listfile)
{
listfile.open(filename,ios::in|ios::out|ios::binary);
if (listfile.fail())
return false;
else
return true;
}
//显示主菜单函数,返回用户的选项
int menu()
{
int selection=0; //存储用户选项
while(true) //检验用户的输入是否正确
{
cout<<"[1]增减记录"<<endl;
cout<<"[2]修改记录"<<endl;
cout<<"[3]删除记录"<<endl;
cout<<"[4]查找记录"<<endl;
cout<<"[5]显示记录"<<endl;
cout<<"[6]退出程序"<<endl;
cout<<"请选择:";
selection=getche()-'0'
if (selection>=1&&selection<=6)
break;
esle
cout<<"输入选项错误!请重新输入";
}
return(selection);
}
//添加记录信息
void add(fstream &listfile)
{
addresslist temp //临时存储记录信息
cout<<"\n 姓名:";
while(true)
{
cin.getline(temp.name,21,'\n');
if (strlen(temp.name)==0)
cout<<"您还没输入姓名!请输入姓名:";
else
break;
}
cout<<"年龄:";
while(true)
{
cin>>temp.age;
cin.ignore();
if(temp.age>=0 && temp.age<=200)
break;
else
cout<<"数据输入错误 请重新输入:";
}
cout<<"地址:";
cin.getline(temp.address,51,'\n');
cout<<"电话:";
cin.getline(temp.phone,21,'\n');
cout<<"电子邮箱:";
cin.getline(temp.email,51,'\n');
listfile.seekp(0l,ios::end);
listfile.write((char*)&temp,sizeof(addresslist));
listfile.flush();
cout<<"添加成功!\n 按任意键继续 ...\n";
getch();
}
//修改记录
void modify(fstream &listfile)
{
bool isexit=false; //判断用户是否想返回主菜单
char modifyname[21]={'\0'}; //存储用户用户输入的姓名
cout<<"\n请输入要修改的同学的姓名;";
cin.getline(modifyname,21,'\n');
int pos=findrecord(listfile,modifyname);
if(-1==pos)
cout<<"对不起,没有"<<modifyname<<"的信息!"endl;
else
{
addresslist temp; //临时存储记录信息
listfile.seekg((long)(sizeof(addresslist)*pos),ios::beg);
listfile.read((char*)&temp,sizeof(addresslist));
while(!isexit)
{
int selection=0;
cout<<endl;
cout<<"[1]姓名"<<endl;
cout<<"[2]年龄"<<endl;
cout<<"[3]地址"<<endl;
cout<<"[4]电话"<<endl;
cout<<"[5]电子邮箱"<<endl;
cout<<"[6]返回"<<endl;
cout<<"\n请输入要修改的选项:";
while(true)
{
selection=getche()-48;
if (selection)>=1 && selection<=6)
break;
else
cout<<"输入选项有误!请重新输入:";
}
cout<<endl;
switch(selection)
{
case 1:
cout<<"原姓名:"<<temp.name<<endl;
cout<<"新姓名:";
while(true)
{
cin.getline(temp.name,21,'\n');
if (strlen(temp.name)==0)
cout<<"您还没输入姓名!请输入姓名";
else
break;
}
cout<<"修改成功!"<<endl;
break;
case 2:
cout<<"原年龄:"<<temp.age<<endl;
cout<<"新年龄:";
while(true)
{
cin>>temp.age;
cin.ignore();
if (temp.age>=0 && temp.age<=200)
break;
else
cout<<"数据输入错误!请重新输入:";
}
cout<<"修改成功!"<<endl;
break;
case 3:
cout<<"原地址:"<<temp.address<<endl;
cout<<"新地址:";
cin.getline(temp.address,51,'\n');
cout<<"修改成功!"<<endl;
break;
case 4:
cout<<"原电话:"<<temp.phone<<endl;
cout<<"新电话:";
cin.getline(temp.phone,14,'\n');
cout<<"修改成功!"<<endl;
break;
case 5:
cout<<"原电子邮箱:"<<temp.email<<endl;
cout<<"新电子邮箱:";
cin.getline(temp.email,51,'\n');
cout<<"修改成功!"<<endl;
break;
case 6:
isexit=true;
break;
}
}
listfile.seekg((long)(sizeof(addresslist)*pos),ios::beg);
listfile.write((char*)&temp,sizeof(addresslist));
listfile.flush();
}
cout<<endl;
}
//删除记录信息
void del(fstream & listfile)
{
char delname[21]={'\0'}; //存储用户输入的姓名
while(true)
{
cout<<"\n请输入要删除的同学的姓名:";
cin.getline(delname,21,'\n');
if(strlen(delname)==0)
cout<<"您未输入姓名!"<<endl;
else
break;
}
int pos=findrecord(listfile,delname);
if (-1==pos)
cout<<"对不起,没有"<<delname<<"的信息!"<<endl;
else
{
char selection; //存储用户选项
cout<<"真的要删除吗?(Y/N):";
while(true)
{
selection=toupper(getch());
cout<<selection<<endl;
if(selection=='Y'||selection=='N')
break;
esle
cout<<"请选择 Y 或 N !并重新输入:";
}
if(selection=='Y')
{
int amount=getamount(listfile)-1; //存储记录数量
addresslist temp; //临时存储记录信息
addresslist*list;
if((ist=new addresslist[amount])==NULL)
exit(0);
//从文件中读入除用户希望删除的记录以外的所有记录
//然后将读入的记录全部重新写入文件中
listfile.seekg(0l,ios::beg);
listfile.read((char*)temp,sizeof(addresslist));
for (int i=0;!listfile.eof();i++) //读入记录信息
{
if(strcmp(delname,temp.name)==0)
i--;
else
list[i]=temp;
listfile.read((char*)&temp,sizeof(addresslist));
}
listfile.close(); //关闭当前文件
listfile.open(filename,ios::out); //重新打开当前文件,删除原来内容
listfile.clear();
if (!listfile)
{
cout<<"can not open file for delete!"<<endl;
exit(0);
}
listfile.close(); //关闭文件,此时原来的文件内容已经删除
//再次按照原来的方式打开文件进行操作
listfile.open(filename,ios::in|ios::out|ios::binary|ios::trunc);
if(!listfile)
{
cout<<"can not open file for write record"<<endl;
exit(0);
}
for(int i=0;i<amount;i++) //将不删除的写入文件
listfile.write((char*)&list[i],sizeof(addrseelist));
listfile.flush();
cout<<"删除成功!"<<endl;
delete []list;
} else
cout<<"未删除!"<<endl;
} //end of else
cout<<"\n按任意键继续...\n";
getch();
}
//查找记录信息
void find(fstream & listfile)
{
char findname[21]={'\0'}; //存储用户输入的姓名
{
cout<<"\n请输入要查找的同学姓名:";
cin.getline(findname,21,'\n');
if(strlen(findname)==0)
cout<<"您未输入姓名!"<<endl;
else
break;
}
int pos=findrecord(listfile,findname);
if(-1==pos)
cout<<"对不起,没有"<<findname<<"的信息!"<<endl;
else
{
addresslist temp; //临时存储记录信息
listfile.seekg((long)(sizeof(addresslist)*pos),ios::beg);
listfile.read((char*)&temp,sizeof(addresslist));
cout<<"姓名:"<<temp.name<<endl;
cout<<"年龄:"<<temp.age<<endl;
cout<<"地址:"<<temp.address<<endl;
cout<<"电话:"<<temp.phone<<endl;
cout<<"电子信箱:"<<temp.email<<endl;
}
cout<<"\n按任意键继续...\n";
getch();
}
//显示记录信息
void display (fstream &listfile)
{
addresslist temp //临时存储读入的记录信息
listfile.clear();
listfile.seekg(0l,ios::beg);
listfile.read((char*)temp,sizeof(addresslist));
cout<<endl;
if (listfile.eof())
cout<<"文件中还没有信息!"<<endl;
else
{
while(!listfile.eof())
{
cout<<"姓名:"<<temp.name<<endl;
cout<<"年龄:"<<temp.age<<endl;
cout<<"地址:"<<temp.address<<endl;
cout<<"电话:"<<temp.phone<<endl;
cout<<"电子信箱:"<<temp.email<<endl;
cout<<endl;
listfile.read((char*)temp,sizeof(addresslist));
}
}
listfile.clear();
cout<<"\n按任意键继续...\n";
getch();
}
//按姓名查找一条记录。如果找到与用户提供的姓名相同的记录
//则返回该记录在文件中的下标位置,否则返回-1
int findrecord (fstream &listfile,const char *pname)
{
int pos=-1; //存储当前记录的下标位置
addresslist temp //临时存储读入的记录信息
listfile.seekg(0l,ios::beg);
listfile.read((char*)&temp,sizeof(addresslist));
while(!listfile.eof())
{
pos++;
if(strcmp(temp.name,pname)==0)
return (pos);
listfile.read((char*)temp,sizeof(addresslist));
}
listfile.clear();
return(-1);
}
//返回文件中记录的数量
int getamount(fstream &listfile)
{
int amount=0; //存储记录的数量
addresslist temp; //临时存储读入的记录信息
listfile.seekg(0l,ios::beg);
listfile.read((char*)&temp,sizeof(addresslist));
while(!listfile.eof())
{
amount++;
listfile.read((char*)&temp,sizeof(addresslist));
}
listfile clear();
return amount;
}