📄 mydatabase.cpp
字号:
// MyDataBase.cpp: implementation of the CMyDataBase class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Worker.h"
#include "MyDataBase.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CMyDataBase::CMyDataBase()
{
}
CMyDataBase::~CMyDataBase()
{
RemoveAll();
}
bool CMyDataBase::Open()
{
if((fp=fopen("database.dat","rb+"))==NULL)
return false;
return true;
}
void CMyDataBase::Close()
{
fclose(fp);
}
void CMyDataBase::AddPerson(CPerson *person)
{
fseek(fp,0,SEEK_END);
person->SaveImfo(fp);
}
bool CMyDataBase::DelPerson(CString num)
{
fclose(fp);
fp=fopen("database.dat","rb+");
CPerson *person=NULL;
//====================================================================
//查找并删除指定编号的职工信息
//在删除职工信息的时候并没有真正把它从文件中删除,只是在PERSON结构中
//的 char isdel 中做个标记,表示它已被删除,这样还有机会把它恢复,防止
//误删。
//真正的删除是在该类的Clean()成员函数中进行。
while((person=GetPerson())!=NULL)
{
if(person->GetNum()!=num||person->IsDel())
{
delete person;
continue;
}
else
{
MovePre();
person->SetDel(true);
person->SaveImfo(fp);
delete person;
return true;
}
}
return false;
}
void CMyDataBase::SetHeadPosition()
{
m_pos=m_personlist.GetHeadPosition();
}
CPerson * CMyDataBase::GetNextPerson()
{
return (CPerson *)m_personlist.GetNext(m_pos);
}
CPerson * CMyDataBase::GetPrePerson()
{
return (CPerson *)m_personlist.GetPrev(m_pos);
}
void CMyDataBase::SetTailPosition()
{
m_pos=m_personlist.GetTailPosition();
}
void CMyDataBase::SaveAll()
{
//====================================================================
//保存所有职工信息
fclose(fp);
fp=fopen("database.dat","wb");
CPerson *person;
for(SetHeadPosition();(person=GetNextPerson())!=NULL;)
person->SaveImfo(fp);
fclose(fp);
Open();
}
void CMyDataBase::GetAllData()
{
CPerson *person;
while((person=GetPerson())!=NULL)
m_personlist.AddTail(person);
}
CPerson * CMyDataBase::GetPerson()
{
//====================================================================
//返回没删除的职工信息
CPerson *person;
person=new CPerson;
while(person->GetImfo(fp))
{
if(!person->IsDel()) //返回没删除的职工信息
return person;
}
delete person;
return NULL;
}
CPerson * CMyDataBase::GetAllPerson()
{
CPerson *person;
person=new CPerson;
while(person->GetImfo(fp))
{
return person; //返回全部的职工信息
}
delete person;
return NULL;
}
void CMyDataBase::RemoveAll()
{
POSITION pos;
pos=m_personlist.GetHeadPosition();
while(pos!=NULL)
{
delete m_personlist.GetNext(pos);
}
m_personlist.RemoveAll();
}
void CMyDataBase::MovePre()
{
if(fp==NULL)
return;
int n=sizeof(PERSON);
fseek(fp,-n,SEEK_CUR);
}
void CMyDataBase::ChangImfo(CPerson *person)
{
person->SaveImfo(fp);
}
void CMyDataBase::Build()
{
if((fp=fopen("database.dat","wb"))==NULL)
{
AfxMessageBox("错误:无法新建数据库!");
return;
}
fclose(fp);
}
bool CMyDataBase::IsEof()
{
if(feof(fp))
return true;
return false;
}
bool CMyDataBase::Clean()
{
//====================================================================
//清除所有被删除的职工信息,以使数据文件变小
if((fp=fopen("database.dat","rb+"))==NULL)
return false;
GetAllData();
fclose(fp);
if((fp=fopen("database.dat","wb"))==NULL)
return false;
CPerson *person;
POSITION pos;
for(pos=m_personlist.GetHeadPosition();pos!=NULL;)
{
person=(CPerson*)m_personlist.GetNext(pos);
person->SaveImfo(fp);
}
fclose(fp);
RemoveAll();
return true;
}
bool CMyDataBase::UnDel(CString num)
{
//====================================================================
//恢复被删除的职工信息
if((fp=fopen("database.dat","rb+"))==NULL)
{
AfxMessageBox("数据库无法打开!");
return false;
}
CPerson *person=NULL;
//先找到被删除的职工编号,再把它被删除的标记该为没被删除的标记
while((person=GetAllPerson())!=NULL)
{
if(person->GetNum()==num)
{
if(person->IsDel())
{
MovePre();
person->SetDel(false);
person->SaveImfo(fp);
AfxMessageBox("该职工信息恢复成功!");
fclose(fp);
delete person;
return true;
}
else
{
AfxMessageBox("该职工信息已在列表中!");
fclose(fp);
return false;
}
}
else
{
delete person;
continue;
}
}
fclose(fp);
AfxMessageBox("无法恢复该职工信息!");
return false;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -