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

📄 myaddrbook.cpp

📁 用C++完成一个学生信息管理系统 要求有界面
💻 CPP
字号:
// MyAddrBook.cpp: implementation of the MyAddrBook class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "addr_book.h"
#include "APeople.h"			// 包函APeople
#include "MMFile.h"
#include "MyAddrBook.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

MyAddrBook::MyAddrBook()
{
	pMMFile=NULL;
	dwSize=sizeof(APeople)*1000+sizeof(short);
}

MyAddrBook::~MyAddrBook()
{
	CloseFile();
}

BOOL MyAddrBook::OpenFile(LPCTSTR FileName)
{
	if(pMMFile)
	{
		MessageBox(NULL,"已经打开,请关闭重试!","系统提示",MB_OK);
		return FALSE;
	}
	pMMFile=new CMMFile(FALSE);
	if(!pMMFile->OpenMem(FileName,"addr_book_map"))
		if(!pMMFile->OpenNewMem(FileName,"addr_book_map",dwSize))
		{
			delete pMMFile;
			pMMFile=NULL;
			return FALSE;
		}
	if(!LoadData())
	{
		return FALSE;
	}
	return TRUE;
}

BOOL MyAddrBook::LoadData()
{
	short Count;
	pMMFile->ReadFromFile(&Count,0,sizeof(short));
	int i;
	APeople *pPeople;
	pList.RemoveAll();
	DWORD dwOffset=sizeof(short);
	for(i=0;i<Count;i++)
	{
		pPeople=new APeople;
		pPeople->Clear();
		pMMFile->ReadFromFile(pPeople,dwOffset,sizeof(APeople));
		dwOffset+=sizeof(APeople);
		pList.AddTail(pPeople);
	}
	return TRUE;
}

BOOL MyAddrBook::UnLoadData()
{
	APeople* pPeople;
	while(!pList.IsEmpty())
	{
		pPeople=(APeople*)pList.RemoveHead();
		if(pPeople)
		{
			pPeople->Clear();
			delete pPeople;
			pPeople=NULL;
		}
	}
	return TRUE;
}

void MyAddrBook::CloseFile()
{
	if(!pMMFile)
	{
		return;
	}
	UnLoadData();
	if(pMMFile)
	{
		pMMFile->CloseMem();
		delete pMMFile;
		pMMFile=NULL;
	}
}

BOOL MyAddrBook::Add(APeople *pPeople)
{
	if(!pMMFile)
	{
		MessageBox(NULL,"请先打开通讯薄文件!","系统提示",MB_OK);
		return FALSE;
	}
	if(!pPeople)
		return FALSE;
	if(pList.GetCount()>=1000)
		return FALSE;
	APeople *pTmpPeople=new APeople();
	memcpy(pTmpPeople,pPeople,sizeof(APeople));
	pList.AddTail(pTmpPeople);
	return TRUE;
}

BOOL MyAddrBook::SaveToFile(LPCTSTR FileName)
{
	if(!pMMFile)
	{
		MessageBox(NULL,"请先打开通讯薄文件!","系统提示",MB_OK);
		return FALSE;
	}
	DWORD sz=sizeof(short)+1000*sizeof(APeople);
	CMMFile* pmmf=new CMMFile(FALSE);
	if(!pmmf->OpenNewMem(FileName,"svsfile",sz))
	{
		delete pmmf;
		return FALSE;
	}
	POSITION pos=pList.GetHeadPosition();
	short cn=pList.GetCount();
	pmmf->WriteToFile(&cn,0,sizeof(short));
	DWORD dwOffset=sizeof(short);
	APeople *pPeople;
	while(pos)
	{
		pPeople=(APeople*)pList.GetNext(pos);
		pmmf->WriteToFile(pPeople,dwOffset,sizeof(APeople));
		dwOffset+=sizeof(APeople);
	}
	pmmf->CloseMem();
	delete pmmf;
	return TRUE;
}

BOOL MyAddrBook::Sort(LPCTSTR szFieldName, BOOL bDestSort)
{
	if(!pMMFile)
	{
		MessageBox(NULL,"请先打开通讯薄文件!","系统提示",MB_OK);
		return FALSE;
	}
	POSITION pos,pos1,pos2;
	pos=pList.GetHeadPosition();
	APeople *p1;
	p1=(APeople*)pList.GetAt(pos);
	if(!p1->Fields(szFieldName))
		return FALSE;
	APeople n1;
	CString s1,s2;
	while(pos)
	{
		pos1=pos;
		pos2=pos;
		p1=(APeople*)pList.GetAt(pos);
		memcpy(&n1,p1,sizeof(APeople));
		while(pos1)
		{
			p1=(APeople*)pList.GetAt(pos1);
			s1=n1.Fields(szFieldName);
			s2=p1->Fields(szFieldName);
			if(bDestSort)
			{
				if(s1<s2)
				{
					memcpy(&n1,p1,sizeof(APeople));
					pos2=pos1;
				}
			}
			else
			{
				if(s1>s2)
				{
					memcpy(&n1,p1,sizeof(APeople));
					pos2=pos1;
				}
			}
			pList.GetNext(pos1);
		}
		p1=(APeople*)pList.GetAt(pos2);
		if(pos2!=pos)
		{
			pList.RemoveAt(pos2);
			pList.InsertBefore(pos,p1);
		}
		pos=pos2;
		pList.GetNext(pos);
	}
	return TRUE;
}

BOOL MyAddrBook::Search(LPCTSTR szFieldName, LPCTSTR szSchValue)
{
	if(!pMMFile)
	{
		MessageBox(NULL,"请先打开通讯薄文件!","系统提示",MB_OK);
		return FALSE;
	}
	APeople* pPeople;
	while(!pList.IsEmpty())
	{
		pPeople=(APeople*)pList.RemoveHead();
		if(pPeople)
		{
			pPeople->Clear();
			delete pPeople;
			pPeople=NULL;
		}
	}
	short Count;
	pMMFile->ReadFromFile(&Count,0,sizeof(short));
	int i;
	APeople aPeople;
	pList.RemoveAll();
	CString s;
	DWORD dwOffset=sizeof(short);
	for(i=0;i<Count;i++)
	{
		pMMFile->ReadFromFile(&aPeople,dwOffset,sizeof(APeople));
		s.Format("%s",aPeople.Fields(szFieldName));
		if(s.Find(szSchValue)>=0)
		{
			pPeople=new APeople;
			memcpy(pPeople,&aPeople,sizeof(APeople));
			pList.AddTail(pPeople);
		}
		dwOffset+=sizeof(APeople);
	}
	return TRUE;
}

BOOL MyAddrBook::Modify(POSITION pos,APeople *pPeople)
{
	if(!pMMFile)
	{
		MessageBox(NULL,"请先打开通讯薄文件!","系统提示",MB_OK);
		return FALSE;
	}
	if(!pPeople)
		return FALSE;
	pList.SetAt(pos,pPeople);
	return TRUE;
}

BOOL MyAddrBook::Delete(POSITION pos)
{
	if(!pMMFile)
	{
		MessageBox(NULL,"请先打开通讯薄文件!","系统提示",MB_OK);
		return FALSE;
	}
	APeople* pPeople=(APeople*)pList.GetAt(pos);
	pList.RemoveAt(pos);
	delete pPeople;
	return TRUE;
}

BOOL MyAddrBook::Save()
{
	if(!pMMFile)
	{
		MessageBox(NULL,"请先打开通讯薄文件!","系统提示",MB_OK);
		return FALSE;
	}
	POSITION pos=pList.GetHeadPosition();
	short cn=pList.GetCount();
	pMMFile->WriteToFile(&cn,0,sizeof(short));
	DWORD dwOffset=sizeof(short);
	APeople *pPeople;
	while(pos)
	{
		pPeople=(APeople*)pList.GetNext(pos);
		pMMFile->WriteToFile(pPeople,dwOffset,sizeof(APeople));
		dwOffset+=sizeof(APeople);
	}
	return TRUE;
}

POSITION MyAddrBook::GetPositionWithIndex(DWORD nIndex)
{
	if(!pMMFile)
	{
		MessageBox(NULL,"请先打开通讯薄文件!","系统提示",MB_OK);
		return FALSE;
	}
	POSITION pos=pList.GetHeadPosition();
	DWORD i;
	for(i=0;i<nIndex;i++)
		pList.GetNext(pos);
	return pos;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -