经典实验-
·一、目的和要求
设计一个利用文件处理方式实现电话号码薄的程序,具有增加数据、更新数据、查询数据、删除数据以及重组文件的功能,删除数据在记录中作删除标志,重组文件指在物理上删除作有删除标志的记录。
·二、系统分析
通过菜单选择调用函数来实现相应的功能,这样条理清晰、整体效果好,便于程序的调试。
定义电话结构体:
struct TelephoneType
{ // 电话结构
bool delTag; // 删除标志
unsigned int seat; // 序号
char name[16]; // 姓名
char teleNo[18]; // 电话号码
};
设计电话号码簿类:
/ 电话号码簿类的声明
class TelephoneBook
{
private:
// 数据成员
fstream file; // 电话号码簿文件
// 辅助函数
void AddData(); // 增加数据
void UpdateData(); // 更新数据
void SearchData(); // 查询数据
void DeleteData(); // 删除数据, 只作删除标志
void Pack(); // 在物理上删除作有删除标记的记录
public:
// 构造函数, 析构函数与方法
TelephoneBook(); // 无参构造函数
virtual ~TelephoneBook(){ file.close(); } // 析构函数
void Run(); // 处理电话号码簿
};
·三、程序结果截图
打开界面

增加数据

修改信息

查询信息
删除信息

重组文件 退出

·四、总结与体会
通过编写电话号码簿的程序,更加深入的理解了C++文件,熟悉了各种对文件操作的函数,并把每个功能用单独的函数分开来编写,提高了代码的效率和可读性。
·五、源程序
#include <iostream>
#include <fstream>
#include <iomanip>
using namespace std;
struct TelephoneType{
bool delTag;
unsigned int seat;
char name[16];
char teleNo[18];
};
class TelephoneBook{
private:
fstream file;
void AddData();
void SearchData();
void UpdateData();
void DeleteData();
void Pack();
void ShowData();
public:
TelephoneBook();
virtual~TelephoneBook()
{
file.close();
}
void Run();
};
TelephoneBook::TelephoneBook()
{
ifstream iFile("telph.dat");
if (iFile.fail())
{
ofstream oFile("telph.dat");
if (oFile.fail())
throw("打开文件失败!");
oFile.close();
}
else
{
iFile.close();
}
file.open("telph.dat", ios::in|ios::out|ios::binary);
if (file.fail())
throw("打开文件失败!");
}
void TelephoneBook::AddData()
{
cout<<" 增加数据"<<endl;
char flag="Y";
TelephoneType tel;
while(toupper(flag)=="Y")
{
cin>>tel.seat>>tel.name>>tel.teleNo;
tel.delTag= true;
file.write((char *)&tel,sizeof(tel));
cout<<"是否继续录入信息?(Y/N)";
cin>>flag;
}
}
void TelephoneBook::SearchData()
{
TelephoneType tel1;
unsigned int seat;
cout<<"输入想要查看的序号:";
cin>>seat;
file.seekg(0);
file.read((char *)&tel1,sizeof(tel1));
while(!file.eof())
{
if(tel1.seat==seat&&tel1.delTag)
break;
file.read((char *)&tel1,sizeof(tel1));
}
if(seat>tel1.seat)
{
cout<<"超出电话信息序号。"<<endl;
}
if(!file.eof())
{
cout<<tel1.seat<<" "<<tel1.name<<" "<<tel1.teleNo<<" "<<tel1.delTag;
}
}
void TelephoneBook::UpdateData()
{
TelephoneType tel2;
unsigned int seat;
cout<<"输入想要修改的序号信息"<<endl;
cin>>seat;
file.seekg(0);
file.read((char *)&tel2,sizeof(tel2));
while(!file.eof())
{
if(seat==tel2.seat)
{
cout<<"显示现有信息:"<<endl;
cout<<"序号"<<" "<<"姓名"<<" "<<"号码"<<" "<<"真值"<<endl;
cout<<tel2.seat<<" "<<tel2.name<<" "<<tel2.teleNo<<" "<<tel2.delTag<<endl;
cout<<"写出修改后的信息:"<<endl;
cin>>tel2.seat>>tel2.name>>tel2.teleNo;
file.seekg(-sizeof(TelephoneType), ios::cur);
file.write((char *)&tel2,sizeof(tel2));
break;
}
file.read((char *)&tel2,sizeof(tel2));
}
}
void TelephoneBook::DeleteData()
{
TelephoneType tel3;
unsigned int seat;
cout<<"输入做删除标记的序号信息:"<<endl;
cin>>seat;
file.seekg(0);
file.read((char *)&tel3,sizeof(tel3));
while(!file.eof())
{
if(seat==tel3.seat)
{
break;
}
file.read((char *)&tel3,sizeof(tel3));
}
if(!file.eof())
{
cout<< "被删除记录为:" << endl;
cout<<" "<<tel3.seat<<" "<<tel3.name<<" "<<tel3.teleNo<<endl;
tel3.delTag=false;
file.seekg(-sizeof(TelephoneType), ios::cur);
file.write((char *)&tel3, sizeof(tel3));
cout<<"删除成功!"<<endl;
}
else
{
cout<<"删除失败!"<<endl;
file.clear();
}
}
void TelephoneBook::ShowData()
{
cout<<" 电话簿"<<endl;
TelephoneType tel5;
file.seekg(0);
file.read((char *)&tel5,sizeof(tel5));
while(!file.eof())
{
cout<<tel5.seat<<" "<<tel5.name<<" "<<tel5.teleNo<<" "<<tel5.delTag<<endl;
file.read((char *)&tel5,sizeof(tel5));
}
}
void TelephoneBook::Pack()
{
TelephoneType tel4;
ofstream outfile("temp.dat",ios::app|ios::binary);
file.seekg(0);
file.read((char *)&tel4,sizeof(tel4));
while(!file.eof())
{
if(tel4.delTag)
{
outfile.write((char *)&tel4,sizeof(tel4));
}
file.read((char *)&tel4,sizeof(tel4));
}
file.close();
outfile.close();
remove("telph.dat");
rename("temp.dat","telph.dat");
file.open("telph.dat", ios::in|ios::out|ios::binary);
cout<<"成功删除信息!!!"<<endl;
}
void TelephoneBook::Run()
{
int select;
while(select!=7)
{
cout<<" 电话簿"<<endl;
cout<<"1.增加数据 2.更新数据"<<endl;
cout<<"3.查询数据 4.删除数据"<<endl;
cout<<"5.重组文件 6.查看数据"<<endl;
cout<<"7.退出"<<endl;
cout<<"请输入想要进行的操作";
cin>>select;
switch(select)
{
case 1:AddData();break;
case 2:UpdateData();break;
case 3:SearchData();break;
case 4:DeleteData();break;
case 5:Pack();break;
case 6:ShowData();break;
case 7:break;
}
}
}
int main()
{
TelephoneBook b;
int a;
b.Run();
system("PAUSE");
return 0;
}


