?? usortfile.cpp
字號:
/*******************************************************************************************
* *
* Ubase-III/實用工具函數庫 *
* *
* Copy Right 2001-2002,LandStanding Co.,Ltd.NewLand Group. All Right Reserved. *
* *
* *
*******************************************************************************************/
/*******************************************************************************************
*
* FILE:
* usortfile.cpp
*
* Introduction:
* 對排序定長記錄文件的記錄讀寫、刪除等操作。
*
* Logs:
* 2002.10.30 Created by ChenXiaoyuer
* 2004.01.08 Modified by ChenHaihan
*
********************************************************************************************/
/*********************************************************************************************
* include files
*********************************************************************************************/
#include "uSortFile.h"
// -------------------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////////////
// 功能說明 : 缺省構造函數
// 輸入參數 : VOID
// 輸出參數 : VOID
// 返回值 : VOID
////////////////////////////////////////////////////////////////////////////////////////
CSortRecordFile::CSortRecordFile ()
{
zfp = NULL;
memset ( m_szFileName, 0, sizeof(m_szFileName));
m_nRecLen = 0;
m_nStartOffset = 0;
m_bisAscending = TRUE;
}
////////////////////////////////////////////////////////////////////////////////////////
// 功能說明 : 構造函數
// 輸入參數 : szRecordFileName, 記錄文件名稱
// 輸入參數 : nRecLen, 固定記錄長度
// 輸入參數 : nStartOffset, 記錄在文件中的起始位移
// 輸入參數 : isCreate 是否需要新創建
// 輸出參數 : VOID
// 返回值 : VOID
////////////////////////////////////////////////////////////////////////////////////////
CSortRecordFile::CSortRecordFile(
IN const char *szRecordFileName,
IN unsigned int nRecLen,
IN unsigned int nStartOffset,
IN BOOL isCreate
)
{
m_nRecLen = nRecLen;
m_nStartOffset = nStartOffset;
m_bisAscending = TRUE;
memset (m_szFileName, 0, sizeof(m_szFileName));
if ( szRecordFileName != NULL )
{
strncpy ( m_szFileName, szRecordFileName, sizeof(m_szFileName)-1);
}
// 根據新創建標志,打開存在文件或新創建一個文件
if ( strlen(m_szFileName)>0 )
{
if ( !isCreate )
{
zfp = zfopen ( m_szFileName, "r+" );
if ( zfp == NULL )
zfp = zfopen ( m_szFileName, "w+" );
}
else
zfp = zfopen ( m_szFileName, "w+" );
}
else
zfp = NULL;
}
////////////////////////////////////////////////////////////////////////////////////////
// 功能說明 : 關閉排序文件
// 輸入參數 : VOID
// 輸出參數 : VOID
// 返回值 : VOID
////////////////////////////////////////////////////////////////////////////////////////
CSortRecordFile::~CSortRecordFile (void)
{
Close();
}
////////////////////////////////////////////////////////////////////////////////////////
// 功能說明 : 打開函數
// 輸入參數 : szRecordFileName, 記錄文件名稱
// 輸入參數 : nStartOffset, 記錄在文件中的起始位移
// 輸入參數 : nRecLen, 固定記錄長度
// 輸入參數 : isCreate 是否需要新創建文件
// 輸出參數 : VOID
// 返回值 :
////////////////////////////////////////////////////////////////////////////////////////
BOOL CSortRecordFile::Open(
IN const char *szRecordFileName,
IN unsigned int nRecLen,
IN unsigned int nStartOffset,
IN BOOL isCreate
)
{
BOOL bRet = TRUE;
m_nRecLen = nRecLen;
m_nStartOffset = nStartOffset;
m_bisAscending = TRUE;
memset (m_szFileName, 0, sizeof(m_szFileName));
if ( szRecordFileName != NULL )
{
strncpy ( m_szFileName, szRecordFileName, sizeof(m_szFileName)-1);
}
if ( zfp != NULL )
zfclose(zfp);
// 根據新創建標志,打開存在文件或新創建一個文件
if ( strlen(m_szFileName)>0 )
{
if ( !isCreate )
{
zfp = zfopen ( m_szFileName, "r+" );
if ( zfp == NULL )
{
zfp = zfopen ( m_szFileName, "w+" );
if ( zfp == NULL )
bRet = FALSE;
}
}
else
zfp = zfopen ( m_szFileName, "w+" );
if (zfp == NULL )
bRet = FALSE;
}
else
{
zfp = NULL;
bRet = FALSE;
}
return bRet;
}
////////////////////////////////////////////////////////////////////////////////////////
// 功能說明 : 關閉排序文件
// 輸入參數 : VOID
// 輸出參數 : VOID
// 返回值 : BOOL
////////////////////////////////////////////////////////////////////////////////////////
BOOL CSortRecordFile::Close (void)
{
if ( zfp != NULL)
zfclose (zfp);
zfp = NULL;
return TRUE;
}
////////////////////////////////////////////////////////////////////////////////////////
// 功能說明 : 插入一條記錄
// 輸入參數 :
// 輸出參數 : VOID
// 返回值 : BOOL 插入成功或失敗
////////////////////////////////////////////////////////////////////////////////////////
BOOL CSortRecordFile::InsertRecord (
IN const void *pRecBuff,
IN unsigned int nCompFieldOffset,
IN unsigned int nCompFieldLength
)
{
BOOL bInsertRet = TRUE;
int nFindRet = 0;
int nBytes = 0;
long nRecordOffset = 0L;
// 非法參數,返回失敗
if ( pRecBuff == NULL || nCompFieldOffset+nCompFieldLength > m_nRecLen )
{
return FALSE;
}
// 查找記錄,有相同記錄則返回失敗;無則插入記錄
//nRecordOffset = FindRecord (
// pRecBuff, nCompFieldOffset, nCompFieldLength, &nFindRet );
//2004.1.8:FindRecord的第一個參數為比對字段(關鍵字)在記錄中的起始位移
nRecordOffset = FindRecord (
(char *)pRecBuff+nCompFieldOffset, nCompFieldOffset, nCompFieldLength, &nFindRet );
// 文件查找失敗
if ( nFindRet == -2 )
{
bInsertRet = FALSE;
}
// 有相同鍵值的記錄
else if ( nFindRet == 0 && nRecordOffset >= 0 )
{
bInsertRet = FALSE;
}
// 無相同鍵值記錄,小于文件中當前位移的記錄, 插入當前位置
else if ( nFindRet < 0 && nRecordOffset >= 0 )
{
bInsertRet = MoveRecordAfterOffset ( nRecordOffset, m_nRecLen );
if ( bInsertRet != FALSE )
{
bInsertRet = WriteRecord (nRecordOffset, pRecBuff, m_nRecLen, &nBytes );
}
}
// 無相同鍵值記錄,大于文件中當前位移的記錄, 插入后條記錄
else if ( nFindRet > 0 && nRecordOffset >= 0 )
{
nRecordOffset += m_nRecLen;
bInsertRet = MoveRecordAfterOffset ( nRecordOffset, m_nRecLen );
if ( bInsertRet != FALSE )
{
bInsertRet = WriteRecord (nRecordOffset, pRecBuff, m_nRecLen, &nBytes );
}
}
else
{
bInsertRet = FALSE;
}
return bInsertRet;
}
////////////////////////////////////////////////////////////////////////////////////////
// 功能說明 : 刪除一條記錄
// 輸入參數 : CompBuff 比較緩沖(關鍵字)
// 輸入參數 : nRecOffset 比對(關鍵字)在記錄中的位移
// 輸入參數 : nCompBytes 比對(關鍵字)長度
// 輸出參數 : VOID
// 返回值 : BOOL 刪除成功或失敗
////////////////////////////////////////////////////////////////////////////////////////
BOOL CSortRecordFile::DeleteRecord (
IN const void *CompBuff,
IN unsigned int nCompFieldOffset,
IN unsigned int nCompFieldLength
)
{
BOOL bDeleteRet = TRUE;
int nFindRet = 0;
long nRecordOffset = 0L;
// 非法參數,返回失敗
if ( CompBuff == NULL || nCompFieldOffset+nCompFieldLength > m_nRecLen )
{
return FALSE;
}
// 查找記錄,有則刪除并覆蓋刪除記錄;無則返回失敗
//nRecordOffset = FindRecord (
// pRecBuff, nCompFieldOffset, nCompFieldLength, &nFindRet );
//2004.1.8:FindRecord的第一個參數為比對字段(關鍵字)在記錄中的起始位移
nRecordOffset = FindRecord (
CompBuff, nCompFieldOffset, nCompFieldLength, &nFindRet );
if ( nFindRet == 0 )
{
bDeleteRet = MoveRecordAfterOffset (nRecordOffset+m_nRecLen, 0-m_nRecLen );
}
else
{
bDeleteRet = FALSE;
}
return bDeleteRet;
}
////////////////////////////////////////////////////////////////////////////////////////
// 功能說明 : 修改一條記錄
// 輸入參數 :
// 輸出參數 : VOID
// 返回值 : BOOL 修改成功或失敗
////////////////////////////////////////////////////////////////////////////////////////
BOOL CSortRecordFile::UpdateRecord (
IN const void *pRecBuff,
IN unsigned int nCompFieldOffset,
IN unsigned int nCompFieldLength
)
{
BOOL bRet = FALSE;
int nFindRet = 0;
int nBytes = 0;
long nRecordOffset = 0L;
// 非法參數,返回失敗
if ( pRecBuff == NULL || nCompFieldOffset+nCompFieldLength > m_nRecLen )
{
return FALSE;
}
// 查找記錄,有則修改;無則返回失敗
//nRecordOffset = FindRecord (
// pRecBuff, nCompFieldOffset, nCompFieldLength, &nFindRet );
//debug:FindRecord的第一個參數為比對字段(關鍵字)在記錄中的起始位移
nRecordOffset = FindRecord (
(char *)pRecBuff+nCompFieldOffset, nCompFieldOffset, nCompFieldLength, &nFindRet );
if ( nFindRet == 0 )
{
bRet = WriteRecord ( nRecordOffset, pRecBuff, m_nRecLen, &nBytes );
if ( bRet != TRUE || nBytes != (int)m_nRecLen )
{
bRet = FALSE;
}
}
else
{
bRet = FALSE;
}
return bRet;
}
////////////////////////////////////////////////////////////////////////////////////////
// 功能說明 : 寫入記錄
// 輸入參數 : nOffset 寫入位置
// 輸入參數 : WriteBuff 寫入緩沖
// 輸入參數 : BytesToWrite 準備寫入字節
// 輸出參數 : BytesWritten 實際寫入字節
// 返回值 : BOOL
////////////////////////////////////////////////////////////////////////////////////////
BOOL CSortRecordFile::WriteRecord(
IN long nOffset,
IN const void *WriteBuff,
IN unsigned int BytesToWrite,
OUT int *BytesWritten
)
{
BOOL bRet = TRUE;
int nWritten = 0;
// 參數判斷
if ( zfp == NULL || WriteBuff == NULL || BytesWritten == NULL )
{
bRet = FALSE;
if ( BytesWritten != NULL )
*BytesWritten = -1;
goto __ENDWRITE__;
}
// 若 nOffset 大于 0 , 則為指定位置寫入數據,否則插入文件頭部
if ( nOffset >= 0 )
zfseek (zfp, nOffset, ZSEEK_SET);
else
{
// 參數錯誤也返回失敗
// zfseek (zfp, 0, ZSEEK_SET ); close 2002/12/09
bRet = FALSE;
*BytesWritten = -1;
goto __ENDWRITE__;
}
// 寫入數據
nWritten = zfwrite ( WriteBuff, sizeof(char), BytesToWrite, zfp);
if (nWritten != (int)BytesToWrite)
{
bRet = FALSE;
*BytesWritten = nWritten;
goto __ENDWRITE__;
}
*BytesWritten = nWritten;
__ENDWRITE__:
return bRet;
}
////////////////////////////////////////////////////////////////////////////////////////
// 功能說明 : 從排序文件中讀取數據
// 輸入參數 : nOffset 文件偏移
// 輸入參數 : ReadBuff 讀取緩沖
// 輸入參數 : BytesToRead 讀取字節
// 輸出參數 : BytesRead 實際讀取字節
// 返回值 : BOOL
////////////////////////////////////////////////////////////////////////////////////////
BOOL CSortRecordFile::ReadRecord(
IN long nOffset,
OUT void *ReadBuff,
IN unsigned int BytesToRead,
OUT int *BytesRead
)
{
BOOL bRet = TRUE;
int nRead = 0;
// 參數判斷
if ( zfp == NULL || ReadBuff == NULL || BytesRead == NULL )
{
bRet = FALSE;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -