⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mydatabase.cpp

📁 用C++语言编写得职工信息管理系统
💻 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 + -