c++电话簿管理程序

lynjimmy 2010-08-25 09:30:54
#ifndef ADDRESS_H
#define ADDRESS_H
#include<iostream>
#include<iomanip>
#include<fstream>
#include<string>
using namespace std;
class Address
{
bool Status; //通信录状态
char Name[31]; //姓名
char Phone[21]; //电话
char Add[51]; //地址
char Postcode[8]; //邮编
char Email[31]; //Email
public:
Address(){Status=true;} //构造时通信录清空
string GetName()const; //取姓名
string GetPhone()const; //取电话
string GetAdd()const; //取地址
string GetPostcode()const; //取邮编
string GetEmail()const; //取Email
bool isEmpty(); //取通信录状态
void Enter(string&name,string&phone,string&add,string&postcode,string&email); //输入通信录
void Set(); //置通信录状态0,非空
void Clear(); //置通信录状态1,空
};
#endif


#include"Address.h"
#include<iostream>
#include<iomanip>
#include<fstream>
#include<string>
using namespace std;
string Address::GetName()const
{
string s=Name;
return s;
}
string Address::GetPhone()const
{
string s=Phone;
return s;
}
string Address::GetAdd()const
{
string s=Add;
return s;
}
string Address::GetPostcode()const
{
string s=Postcode;
return s;
}
string Address::GetEmail()const
{
string s=Email;
return s;
}
bool Address::isEmpty(){return Status;}
void Address::Enter(string&name,string&phone,string&add,string&postcode,string&email)
{
int len=name.length();
if(len>30)len=30; //输入超长时截断
name.copy(Name,len,0);
Name[len]=0; //字符串结束符,把string转换成char*
len=phone.length();
if(len>20)len=20;
phone.copy(Phone,len,0);
Phone[len]=0;
len=add.length();
if(len>50)len=50;
add.copy(Add,len,0);
Add[len]=0;
len=postcode.length();
if(len>7)len=7;
postcode.copy(Postcode,len,0);
Postcode[len]=0;
len=email.length();
if(len>30)len=30;
email.copy(Email,len,0);
Email[len]=0;
}
void Address::Set(){Status=false;}
void Address::Clear(){Status=true;}

#ifndef ADDRESSBOOK_H
#define ADDRESSBOOK_H
#include"Address.h"
#include<iostream>
#include<fstream>
#include<iomanip>
#include<string>
using namespace std;
const int ItemNum=100; //通信录最大数量
class AddressBook
{
Address Item[ItemNum];
int Num; //通信录数量
int FindFree(); //查找空的通信录
public:
AddressBook(){Num=0;}
void Enter(); //输入
void Erase(); //删除
void Load(); //读盘
void Save(); //存盘
void List(); //显示
};
#endif

#include"Address.h"
#include"AddressBook.h"
#include<iostream>
#include<fstream>
#include<iomanip>
#include<string>
using namespace std;
ostream&operator<<(ostream&output,const Address&addr)
{
//重载<<,直接用cout输出通信录
output<<setiosflags(ios::left)<<setw(31)
<<addr.GetName()<<setw(21)<<addr.GetPhone()<<setw(51)
<<addr.GetAdd()<<setw(8)<<addr.GetPostcode()<<setw(31)
<<addr.GetEmail();
return output;
}
int AddressBook::FindFree()
{
int t;
for(t=0;t<ItemNum;t++)
if(Item[t].isEmpty())return t;
return -1; //电话簿已满
}
void AddressBook::Enter()
{
string name,phone,add,postcode,email;
int pointer;
pointer=FindFree();
if(pointer==-1)cout<<"电话不已存满";
else
{
cout<<"电话簿中有"<<Num<<"条通信录"<<endl;
cout<<"输入姓名:";
cin>>name;
cout<<"输入电话号码:";
cin>>phone;
cout<<"输入地址:";
cin>>add;
cout<<"输入邮编:";
cin>>postcode;
cout<<"输入Email:";
cin>>email;
Item[pointer].Enter(name,phone,add,postcode,email);
Item[pointer].Set();
Num++;
}
}
void AddressBook::Erase()
{
int t;
string s;
cout<<"电话簿中有"<<Num<<"条通信录"<<endl;
if(!Num)cout<<"电话簿已空!\n";
else
{
cout<<"输入姓名:";
cin>>s;
for(t=0;t<ItemNum;t++)
{
if(!Item[t].isEmpty()&&Item[t].GetName()==s)
{
Item[t].Clear();
Num--;
cout<<"已经删除"<<s<<"的通信录。\n";
break;
}
}
if(t==ItemNum)
{
cout<<"该姓名不存在\n";
cin.get();
}
}
}
void AddressBook::List()
{
int t,i,j;
Address list[ItemNum],temp;
if(!Num)cout<<"电话簿已空!"<<endl;
else
{
cout<<"电话簿中有"<<Num<<"条通信录" <<endl;
for(t=0;t<ItemNum;t++)list[t]=Item[t];
for(i=0;i<ItemNum;i++)
{//排序
for(j=ItemNum-1;j>i;j--)
if(list[j-1].GetName()>list[j].GetName())
{
temp=list[j-1];
list[j-1]=list[j];
list[j]=temp;
}
}
cout<<setiosflags(ios::left)<<setw(31)
<<"姓名"<<setw(21)<<"电话"<<setw(51)
<<"地址"<<setw(8)<<"邮编"<<setw(31)<<"Email"<<endl;
for(t=0;t<ItemNum;++t)
{
if(!list[t].isEmpty())
cout<<list[t]<<endl;
}
}
}
void AddressBook::Save()
{
ofstream file;
int i;
char fname[41];
file.open(fname,ios::out);
if(!file)
{
cout<<"打开文件失败!\n";
cin.get();
}
else
{
for(i=0;i<ItemNum;i++)
{
if(file&&!file.eof())
file.write(reinterpret_cast<const char*>(&Item[i]),sizeof(Address));
}
file.close();
}
}
void AddressBook::Load()
{
ifstream file;
int i;
char fname[41];
cout<<"输入读取的文件名:";
cin>>fname;
file.open(fname,ios::in);
if(!file)
{
cout<<"打开文件夹失败!\n";
cin.get();
}
else
{
Num=0;
for(i=0;i<ItemNum;i++)
{
if(file&&!file.eof())
file.read(reinterpret_cast<char*>(&Item[i]),sizeof(Address));
if(!Item[i].isEmpty()) //mark ?
Num++;
}
file.close();
}
}

#include"Address.h"
#include"AddressBook.h"
#include<iostream>
#include<fstream>
#include<iomanip>
#include<string>
using namespace std;
int menu_select();
int menu_select() //显示主菜单
{
char c;
cout<<"************************************\n";
cout<<"* 模拟电话簿 v2.0修正版*\n";
cout<<"* *\n";
cout<<"* 1.添加通信录*\n";
cout<<"* 2.删除通信录*\n";
cout<<"* 3.显示通信录*\n";
cout<<"* 4.电话簿存盘*\n";
cout<<"* 5.读取电话簿*\n";
cout<<"* 6.退出系统*\n";
cout<<"************************************\n";
cout<<"\n请输入(1~6):";
do //键盘输入循环
{
cin.get(c);
}
while(c<'1'||c>'6');
return c-48;
}
int main()
{
char choice;
AddressBook maillist;
for(;;) //循环,直到键盘输入结束代码
{
choice=menu_select();
switch(choice) //根据键盘的输入,调用相应的功能
{
case 1:maillist.Enter();break;
case 2:maillist.Erase();break;
case 3:maillist.List();break;
case 4:maillist.Save();break;
case 5:maillist.Load();break;
case 6:exit(0);
}
}
return 1;
}



我根据书本改编来的,但出现了几个问题:
1。加了邮编等属性后显示通信录时无法对齐,试了好久也没弄好。
2.存盘后读取文件,文件名老是错。。。
3。我换成txt存盘后出现"烫烫烫。。。的乱码",只能存入姓名,之后全是乱码,是不是要初始化一下。
请高手指点



...全文
697 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
lynjimmy 2010-09-06
  • 打赏
  • 举报
回复
\t 和\n 我试了,都不能,等了这么久终于有人回答了,感激。。。
kyzyyhw 2010-08-26
  • 打赏
  • 举报
回复
能不能用 "\t"在输出的时候使它对齐
anniue 2010-08-26
  • 打赏
  • 举报
回复
好长的代码, 如果出现烫烫那么肯定是内存未初始化 用memset(str,0x0,sizeof(str)),至于对不齐,怎么没看到list 函数对齐是不是有点问题撒下面是将格式处理好的,你看下:

#ifndef ADDRESS_H
#define ADDRESS_H
#include<iostream>
#include<iomanip>
#include<fstream>
#include<string>
using namespace std;
class Address
{
bool Status; //通信录状态
char Name[31]; //姓名
char Phone[21]; //电话
char Add[51]; //地址
char Postcode[8]; //邮编
char Email[31]; //Email
public:
Address(){Status=true;} //构造时通信录清空
string GetName()const; //取姓名
string GetPhone()const; //取电话
string GetAdd()const; //取地址
string GetPostcode()const; //取邮编
string GetEmail()const; //取Email
bool isEmpty(); //取通信录状态
void Enter(string&name,string&phone,string&add,string&postcode,string&email); //输入通信录
void Set(); //置通信录状态0,非空
void Clear(); //置通信录状态1,空
};
#endif


#include"Address.h"
#include<iostream>
#include<iomanip>
#include<fstream>
#include<string>
using namespace std;
string Address::GetName()const
{
string s=Name;
return s;
}
string Address::GetPhone()const
{
string s=Phone;
return s;
}
string Address::GetAdd()const
{
string s=Add;
return s;
}
string Address::GetPostcode()const
{
string s=Postcode;
return s;
}
string Address::GetEmail()const
{
string s=Email;
return s;
}
bool Address::isEmpty(){return Status;}
void Address::Enter(string&name,string&phone,string&add,string&postcode,string&email)
{
int len=name.length();
if(len>30)len=30; //输入超长时截断
name.copy(Name,len,0);
Name[len]=0; //字符串结束符,把string转换成char*
len=phone.length();
if(len>20)
len=20;
phone.copy(Phone,len,0);
Phone[len]=0;
len=add.length();
if(len>50)
len=50;
add.copy(Add,len,0);
Add[len]=0;
len=postcode.length();
if(len>7)
len=7;
postcode.copy(Postcode,len,0);
Postcode[len]=0;
len=email.length();
if(len>30)
len=30;
email.copy(Email,len,0);
Email[len]=0;
}
void Address::Set(){Status=false;}
void Address::Clear(){Status=true;}

#ifndef ADDRESSBOOK_H
#define ADDRESSBOOK_H
#include"Address.h"
#include<iostream>
#include<fstream>
#include<iomanip>
#include<string>
using namespace std;
const int ItemNum=100; //通信录最大数量
class AddressBook
{
Address Item[ItemNum];
int Num; //通信录数量
int FindFree(); //查找空的通信录
public:
AddressBook(){Num=0;}
void Enter(); //输入
void Erase(); //删除
void Load(); //读盘
void Save(); //存盘
void List(); //显示
};
#endif

#include"Address.h"
#include"AddressBook.h"
#include<iostream>
#include<fstream>
#include<iomanip>
#include<string>
using namespace std;
ostream&operator<<(ostream&output,const Address&addr)
{
//重载<<,直接用cout输出通信录
output<<setiosflags(ios::left)<<setw(31)
<<addr.GetName()<<setw(21)<<addr.GetPhone()<<setw(51)
<<addr.GetAdd()<<setw(8)<<addr.GetPostcode()<<setw(31)
<<addr.GetEmail();
return output;
}
int AddressBook::FindFree()
{
int t;
for(t=0;t<ItemNum;t++)
if(Item[t].isEmpty())return t;
return -1; //电话簿已满
}
void AddressBook::Enter()
{
string name,phone,add,postcode,email;
int pointer;
pointer=FindFree();
if(pointer==-1)
cout<<"电话不已存满";
else
{
cout<<"电话簿中有"<<Num<<"条通信录"<<endl;
cout<<"输入姓名:";
cin>>name;
cout<<"输入电话号码:";
cin>>phone;
cout<<"输入地址:";
cin>>add;
cout<<"输入邮编:";
cin>>postcode;
cout<<"输入Email:";
cin>>email;
Item[pointer].Enter(name,phone,add,postcode,email);
Item[pointer].Set();
Num++;
}
}
void AddressBook::Erase()
{
int t;
string s;
cout<<"电话簿中有"<<Num<<"条通信录"<<endl;
if(!Num)
cout<<"电话簿已空!\n";
else
{
cout<<"输入姓名:";
cin>>s;
for(t=0;t<ItemNum;t++)
{
if(!Item[t].isEmpty()&&Item[t].GetName()==s)
{
Item[t].Clear();
Num--;
cout<<"已经删除"<<s<<"的通信录。\n";
break;
}
}
if(t==ItemNum)
{
cout<<"该姓名不存在\n";
cin.get();
}
}
}
void AddressBook::List()
{
int t,i,j;
Address list[ItemNum],temp;
if(!Num)
cout<<"电话簿已空!"<<endl;
else
{
cout<<"电话簿中有"<<Num<<"条通信录" <<endl;
for(t=0;t<ItemNum;t++)
list[t]=Item[t];
for(i=0;i<ItemNum;i++)
{//排序
for(j=ItemNum-1;j>i;j--)
if(list[j-1].GetName()>list[j].GetName())
{
temp=list[j-1];
list[j-1]=list[j];
list[j]=temp;
}
}
cout<<setiosflags(ios::left)<<setw(31)
<<"姓名"<<setw(21)<<"电话"<<setw(51)
<<"地址"<<setw(8)<<"邮编"<<setw(31)<<"Email"<<endl;
for(t=0;t<ItemNum;++t)
{
if(!list[t].isEmpty())
cout<<list[t]<<endl;
}
}
}
void AddressBook::Save()
{
ofstream file;
int i;
char fname[41];
file.open(fname,ios::out);
if(!file)
{
cout<<"打开文件失败!\n";
cin.get();
}
else
{
for(i=0;i<ItemNum;i++)
{
if(file&&!file.eof())
file.write(reinterpret_cast<const char*>(&Item[i]),sizeof(Address));
}
file.close();
}
}
void AddressBook::Load()
{
ifstream file;
int i;
char fname[41];
cout<<"输入读取的文件名:";
cin>>fname;
file.open(fname,ios::in);
if(!file)
{
cout<<"打开文件夹失败!\n";
cin.get();
}
else
{
Num=0;
for(i=0;i<ItemNum;i++)
{
if(file&&!file.eof())
file.read(reinterpret_cast<char*>(&Item[i]),sizeof(Address));
if(!Item[i].isEmpty()) //mark ?
Num++;
}
file.close();
}
}

#include"Address.h"
#include"AddressBook.h"
#include<iostream>
#include<fstream>
#include<iomanip>
#include<string>
using namespace std;
int menu_select();
int menu_select() //显示主菜单
{
char c;
cout<<"************************************\n";
cout<<"* 模拟电话簿 v2.0修正版*\n";
cout<<"* *\n";
cout<<"* 1.添加通信录*\n";
cout<<"* 2.删除通信录*\n";
cout<<"* 3.显示通信录*\n";
cout<<"* 4.电话簿存盘*\n";
cout<<"* 5.读取电话簿*\n";
cout<<"* 6.退出系统*\n";
cout<<"************************************\n";
cout<<"\n请输入(1~6):";
do //键盘输入循环
{
cin.get(c);
}
while(c<'1'||c>'6');
return c-48;
}
int main()
{
char choice;
AddressBook maillist;
for(;;) //循环,直到键盘输入结束代码
{
choice=menu_select();
switch(choice) //根据键盘的输入,调用相应的功能
{
case 1:maillist.Enter();break;
case 2:maillist.Erase();break;
case 3:maillist.List();break;
case 4:maillist.Save();break;
case 5:maillist.Load();break;
case 6:exit(0);
}
}
return 1;
}

ztenv 版主 2010-08-26
  • 打赏
  • 举报
回复
你要初始化你的数据段,一开始就要清空,注意字串的结尾符。。。。。。
九度空间 2010-08-26
  • 打赏
  • 举报
回复
没时间看
  • 打赏
  • 举报
回复
2进制模式打开文件操作看看
hanyuwei0 2010-08-26
  • 打赏
  • 举报
回复
帮定下,可能都嫌代码太长了
lynjimmy 2010-08-26
  • 打赏
  • 举报
回复
没人帮我解决一下吗.....
lynjimmy 2010-08-26
  • 打赏
  • 举报
回复
没人帮我解决一下吗.....

65,187

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧