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

📄 usortfile.cpp

📁 嵌入式系统的文件下载源码。实现各类文件的无线下载功能
💻 CPP
📖 第 1 页 / 共 3 页
字号:
/*******************************************************************************************
 *                                                                                         *
 *                                 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 + -