·一、目的和要求
设计一个利用文件处理方式实现电话号码薄的程序,具有增加数据、更新数据、查询数据、删除数据以及重组文件的功能,删除数据在记录中作删除标志,重组文件指在物理上删除作有删除标志的记录。
·二、系统分析
通过菜单选择调用函数来实现相应的功能,这样条理清晰、整体效果好,便于程序的调试。
定义电话结构体:
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<<"\t增加数据"<<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<<"\t"<<tel1.name<<"\t"<<tel1.teleNo<<"\t"<<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<<"序号"<<"\t"<<"姓名"<<"\t"<<"号码"<<"\t\t"<<"真值"<<endl;
- cout<<tel2.seat<<"\t"<<tel2.name<<"\t"<<tel2.teleNo<<"\t"<<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<<"\t"<<tel3.seat<<"\t"<<tel3.name<<"\t"<<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<<"\t\t电话簿"<<endl;
- TelephoneType tel5;
- file.seekg(0);
- file.read((char *)&tel5,sizeof(tel5));
- while(!file.eof())
- {
- cout<<tel5.seat<<"\t"<<tel5.name<<"\t"<<tel5.teleNo<<"\t"<<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.增加数据\t2.更新数据"<<endl;
- cout<<"3.查询数据\t4.删除数据"<<endl;
- cout<<"5.重组文件\t6.查看数据"<<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;
- }