?? cppstudatabase.cpp
字號:
//////////////////////////////////////////////////////
// cppStuDataBase.cpp
#include "hStuDataBase.h"
#include <string.h>
#include <iostream.h>
/////////////////////////////////////////////
// CStuDataBase::CStuDataBase: constructor
CStuDataBase::CStuDataBase()
{
m_RecordCount = 0;
m_pszDataBaseName = NULL;
m_pfWriteFile = NULL;
m_pfReadFile = NULL;
//m_Connected = false;
}
///////////////////////////////////////////////
//CStuDataBase::CStuDataBase: destructor
CStuDataBase::~CStuDataBase()
{
if (m_pszDataBaseName) delete [] m_pszDataBaseName;
}
///////////////////////////////////////////////
//CStuDataBase::Connection
void CStuDataBase::Initialize(char* pszDataBaseName)
{
if (NULL == pszDataBaseName)
throw "Connection to database fail,[Invalid FileName]";
m_pfReadFile = fopen(pszDataBaseName,"a+b");
if (NULL == m_pfReadFile)
throw "Connection to database fail!";
//開始讀取數據
rewind(m_pfReadFile); //跳到文件開頭
int iCount = 0;
while (fread(&m_stuObject[iCount],sizeof(m_stuObject[iCount]),1,m_pfReadFile) == 1)
{
iCount++;
}
fclose(m_pfReadFile);
m_RecordCount = iCount; //保存記錄
if (m_pszDataBaseName)
{
delete []m_pszDataBaseName;
m_pszDataBaseName = NULL;
}
//以下保存文件名以便以后使用
int iFileNameMax = strlen(pszDataBaseName);
m_pszDataBaseName = new char[iFileNameMax + 1];
strncpy(m_pszDataBaseName,pszDataBaseName,iFileNameMax);
m_pszDataBaseName[iFileNameMax] = '\0';
}
/////////////////////////////////////////////////////////////////////
//CStuDataBase::AppendRecord
bool CStuDataBase::AppendRecord(CStudent* pStudent)
{
//數據已滿(CStuDatabase數的學生對像數組已滿:1000個)
if (IsFull())
return false;
m_stuObject[m_RecordCount] = (*pStudent);
m_RecordCount++;
return true;
}
/////////////////////////////////////////////////////////////////////
//CStuDataBase::UpdateRecord
bool CStuDataBase::UpdateRecord(CStudent* pStudent,int iID)
{
if (IsEmpty())
return false;
int iIndex = GetStuIndex(iID);
if (-1 == iIndex)
return false;
//更新舊的學生對像數組的數據
m_stuObject[iIndex] = (*pStudent);
//
//重新提交數據到數據文件
//
if ( PostToDataBase() )
return true;
else
return false;
}
////////////////////////////////////////////////////////////////////
//CStuDataBase::DeleteRecord
bool CStuDataBase::DeleteRecord(int iID)
{
if (IsEmpty())
return false;
int iIndex = GetStuIndex(iID);
if (-1 == iIndex)
return false;
for (int iCount = iIndex; iCount < m_RecordCount - 1; iCount++)
{
m_stuObject[iCount] = m_stuObject[iCount + 1];
}
if (m_RecordCount != 0)
{
m_pfWriteFile = fopen(m_pszDataBaseName,"wb");
if (m_pfWriteFile == NULL)
return false;
int iCount = 0;
while (iCount < m_RecordCount)
{
if (fwrite(&m_stuObject[iCount],sizeof(m_stuObject[iCount]),1,m_pfWriteFile))
iCount++;
}
fclose(m_pfWriteFile);
}
--m_RecordCount; //刪除一條記錄
return true;
}
///////////////////////////////////////////////////////////////////
//CStuDataBase::DeleteRecord
bool CStuDataBase::DeleteRecord(char* pszStuName)
{
if (IsEmpty())
return false;
int iIndex = GetStuIndex(pszStuName);
if (-1 == iIndex)
return false;
for (int iCount = iIndex; iCount < m_RecordCount - 1; iCount++)
{
m_stuObject[iCount] = m_stuObject[iCount + 1];
}
if (m_RecordCount != 0)
{
m_pfWriteFile = fopen(m_pszDataBaseName,"wb");
if (m_pfWriteFile == NULL)
return false;
int iCount = 0;
while (iCount < m_RecordCount)
{
if (fwrite(&m_stuObject[iCount],sizeof(m_stuObject[iCount]),1,m_pfWriteFile))
iCount++;
}
}
--m_RecordCount; //刪除一條記錄
return true;
}
//////////////////////////////////////////////////////////////////////
//CStuDataBase::IsEmpty
bool CStuDataBase::IsEmpty()
{
return (m_RecordCount == 0);
}
//////////////////////////////////////////////////////////////////////
//CStuDataBase::IsFull
bool CStuDataBase::IsFull()
{
return (m_RecordCount >= MAX_STU);
}
/////////////////////////////////////////////////////////////////////
// CStuDataBase::FindRecord
CStudent* CStuDataBase::FindRecord(int iStuID)
{
if (IsEmpty())
return NULL;
int iIndex = GetStuIndex(iStuID);
if (-1 == iIndex)
return NULL;
return (&m_stuObject[iIndex]);
}
////////////////////////////////////////////////////////////////////
//CStuDatabase::FindRecord
CStudent* CStuDataBase::FindRecord(char* pszStuName)
{
if (IsEmpty())
return NULL;
int iIndex = GetStuIndex(pszStuName);
if (-1 == iIndex)
return NULL;
return (&m_stuObject[iIndex]);
}
////////////////////////////////////////////////////////////////////
//CStuDataBase::FirstRecrod
CStudent* CStuDataBase::FirstRecord()
{
if (IsEmpty())
return NULL;
else
return (&m_stuObject[0]);
}
///////////////////////////////////////////////////////////////////
//CStuDataBase::LastRecord
CStudent* CStuDataBase::LastRecord()
{
if (IsEmpty())
return NULL;
else
return (&m_stuObject[m_RecordCount - 1]);
}
//////////////////////////////////////////////////////////////////
//CStuDataBase::GetRecord
CStudent* CStuDataBase::GetRecord(int iIndex)
{
if (IsEmpty())
return NULL;
return (&m_stuObject[iIndex]);
}
//////////////////////////////////////////////////////////////////
//CStuDataBase:PostToDataBase
bool CStuDataBase::PostToDataBase()
{
if (IsEmpty())
return false;
//
//刪除原來的數據文件重新建立,并把新的數據重新寫入
//
m_pfWriteFile = fopen(m_pszDataBaseName,"wb");
if (NULL == m_pfWriteFile)
return false;
int iCount = 0;
while (iCount < m_RecordCount)
{
if (fwrite(&m_stuObject[iCount],sizeof(m_stuObject[iCount]),1,m_pfWriteFile) == 1)
iCount++;
}
fclose(m_pfWriteFile);
m_RecordCount = iCount; //保存記錄(數組下標)
return true;
}
//////////////////////////////////////////////////////////////////
//CStuDataBase::GetRecordCount
int CStuDataBase::GetRecordCount()
{
return m_RecordCount;
}
/////////////////////////////////////////////////////////////////
//CStuDataBase::GetStuIndex
int CStuDataBase::GetStuIndex(int iID)
{
if (IsEmpty())
return -1;
for (int iCount = 0; iCount < m_RecordCount; iCount++)
{
if (m_stuObject[iCount].GetStudentID() == iID)
return iCount;
}
return -1;
}
//////////////////////////////////////////////////////////////////
//CStuDataBase::GetStuIndex
int CStuDataBase::GetStuIndex(char* pszStuName)
{
if (IsEmpty())
return -1;
for (int iCount = 0; iCount < m_RecordCount; iCount++)
{
if (!strcmp(m_stuObject[iCount].GetStudentName(),pszStuName))
return iCount;
}
return -1;
}
/////////////////////////////////////////////////////////////////
//CStuDataBase::refresh
void CStuDataBase::Refresh()
{
m_pfReadFile = fopen(m_pszDataBaseName,"rb");
if (NULL == m_pfReadFile)
{
return;
}
rewind(m_pfReadFile);
int iCount = 0;
while (fread(&m_stuObject[iCount],sizeof(m_stuObject[iCount]),1,m_pfReadFile))
{
iCount++;
}
fclose(m_pfReadFile);
m_RecordCount = iCount;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -