📄 usortfile.h
字号:
/*******************************************************************************************
* *
* Ubase-III *
* *
* Copy Right 2001-2002,LandStanding Co.,Ltd.NewLand Group. All Right Reserved. *
* *
* *
******************************************************************************************/
/******************************************************************************************
*
* FILE:
* uSortFile.h
*
* Introduction:
* 对排序定长记录文件的记录读写、删除等操作。
*
* Logs:
* 2002.11.04 Created by ChenXiaoyuer
* 2005.4.10 Modified by ChenGuolian
*
*******************************************************************************************/
#ifndef __SORTRECORDFILE_H__
#define __SORTRECORDFILE_H__
#include <ubase.h>
#define BLOCK64 64 // 模糊查询时,每次读取块数64
#define BLOCK128 128 // 模糊查询时,每次读取块数128
#define BLOCK256 256 // 模糊查询时,每次读取块数128
// 函数参数修饰符
#define INOUT
#define IN
#define OUT
// 部分返回值定义
#ifndef ACTION_SUCCESS
#define ACTION_FAIL -2
#define ACTION_CANCEL -1
#define ACTION_SUCCESS 0
#endif
#define SORTMAXPATH 256
#define IN
#define OUT
#define INOUT
#define RECCNT_PERBLK 128 // 每块的记录条数
#define MFree(ptr) {if(ptr!=NULL)free(ptr);ptr=NULL;}
class CSortRecordFile {
public:
CSortRecordFile(IN const char *szRecordFileName, IN unsigned int nRecLen, IN unsigned int nStartOffset=0, BOOL isCreate = FALSE );
CSortRecordFile();
~CSortRecordFile();
// -------------------------------------------------------------------------------------
// 文件打开关闭等最外部的公共函数
// -------------------------------------------------------------------------------------
public:
BOOL Open(IN const char *szRecordFileName, IN unsigned int nRecLen, IN unsigned int nStartOffset=0, BOOL isCreate = FALSE );
BOOL Close(void);
int GetRecordCount (void); // 获取排序定长文件记录条数
long GetFileBytes (void); // 获取排序定长文件总字节数
// -------------------------------------------------------------------------------------
// 复合文件记录操作函数,调用文件记录操作函数
// -------------------------------------------------------------------------------------
public:
BOOL QuickSort( // 快速排序
IN unsigned int nCompFieldOffset, /* 排序比较字段位移 */
IN unsigned int nCompFieldLength, /* 排序比较字段长度 */
IN unsigned int nStartRecordNO, /* 起始记录号 */
IN unsigned int nEndRecordNO /* 结束记录号 */
);
BOOL InsertRecord ( // 插入一条记录
IN const void *pRecBuff, /* 记录缓冲 */
IN unsigned int nCompFieldOffset, /* 比较字段在记录中位移 */
IN unsigned int nCompFieldLength /* 比较字段在记录中长度 */
);
BOOL DeleteRecord ( // 删除一条记录
IN const void *CompBuff, /* 记录缓冲 */
IN unsigned int nCompFieldOffset, /* 比较字段在记录中位移 */
IN unsigned int nCompFieldLength /* 比较字段在记录中长度 */
);
BOOL UpdateRecord ( // 修改一条记录
IN const void *pRecBuff, /* 记录缓冲 */
IN unsigned int nCompFieldOffset, /* 比较字段在记录中位移 */
IN unsigned int nCompFieldLength /* 比较字段在记录中长度 */
);
// -------------------------------------------------------------------------------------
// 文件记录操作函数,调用OS 文件操作函数
// -------------------------------------------------------------------------------------
public: // 对文件记录操作
BOOL WriteRecord( // 写入一条记录
IN long nOffset, /* 文件指针位移 */
IN const void *WriteBuff, /* 内存缓冲地址 */
IN unsigned int BytesToWrite, /* 写入文件字节 */
OUT int *BytesWritten /* 实际写入字节 */
);
BOOL ReadRecord ( // 读取一条记录
IN long nOffset, /* 文件指针位移 */
OUT void *ReadBuff, /* 内存缓冲地址 */
IN unsigned int BytesToRead, /* 读入内存字节 */
OUT int *BytesRead /* 实际读入字节*/
);
long FindRecord ( // 查找一条记录
IN const void *CompBuff, /* 比较缓冲 */
IN unsigned int nRecOffset, /* 比较在记录中的位移 */
IN unsigned int nCompBytes, /* 比较长度 */
OUT int *nCompResult /* 比较结果 */
);
BOOL MoveRecordAfterOffset( // 大批量移动记录
unsigned long nMoveBeginOffset, /* 开始文件位移 */
long nMoveOffset /* 移动文件位移 */
);
// -------------------------------------------------------------------------------------
// 2002/12/30 添加的模糊查询函数
// -------------------------------------------------------------------------------------
long BlueSearchRecord ( // 模糊查找一条记录,并返回查找到第一条记录
IN const void *CompBuff, /* 比较缓冲 */
IN unsigned int nRecOffset, /* 比较在记录中相对位移 */
IN unsigned int nCompBytes, /* 比较长度 */
OUT int *nCompResult /* 比较结果 */
);
// -------------------------------------------------------------------------------------
// 由快速排序调用的内部函数
// -------------------------------------------------------------------------------------
private:
int _qsort_findpivot (
IN unsigned int nStartRecordNO,
IN unsigned int nEndRecordNO
);
int _qsort_partition (
IN unsigned int nCompFieldOffset,
IN unsigned int nCompFieldLength,
IN unsigned int nStartRecordNO,
IN unsigned int nEndRecordNO,
IN unsigned int nPivotRecordNO
);
BOOL _qsort_swap (
IN unsigned int nStartRecordNO,
IN unsigned int nEndRecordNO
);
BOOL _qsort_getkey (
IN unsigned int nCompFieldOffset,
IN unsigned int nCompFieldLength,
IN unsigned int nRecordNO,
OUT void *pKeyBuff
);
// -------------------------------------------------------------------------------------
private:
BOOL BlueSearchData (
IN const void *szSrcData,
IN unsigned int nSrcLen,
IN const void *szDestData,
IN unsigned int nDestLen
);
// -------------------------------------------------------------------------------------
private:
ZFILE *zfp;
char m_szFileName[SORTMAXPATH];
BOOL m_bisAscending; // 升序文件或降序文件
unsigned int m_nRecLen; // 固定记录长度
unsigned int m_nStartOffset; // 记录在文件中起始位移
};
#endif
////////////////////////////////////////////////////////////////////////////////////////
// [11/5/2002] end line of sortfile.h
////////////////////////////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -