经典实验-

·一、目的和要求

    设计一个利用文件处理方式实现电话号码薄的程序,具有增加数据、更新数据、查询数据、删除数据以及重组文件的功能,删除数据在记录中作删除标志,重组文件指在物理上删除作有删除标志的记录。

·二、系统分析

    通过菜单选择调用函数来实现相应的功能,这样条理清晰、整体效果好,便于程序的调试。

定义电话结构体:

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;
}
hmoban主题是根据ripro二开的主题,极致后台体验,无插件,集成会员系统
自学咖网 » 经典实验-