📄 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 + -