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

📄 routelink_update.c

📁 本程序的功能是对导航数据中的道路情况数据进行整理
💻 C
📖 第 1 页 / 共 2 页
字号:



	/* Exception prevention												   */
	if( (NULL == pbUpdFileName) || (NULL == pbLinkData) ||
													(NULL == pstFilePos) )
	{
		return RET_FAILED;
	}

	/* Temporary file name get					*/
	memset( abTmpFileName, 0, sizeof(abTmpFileName) );
	RTL_TMPFILE_FILENAME( abTmpFileName, pbUpdFileName );

	/* Get the size of original file			*/
	iOrgFileSize = routelink_getfsize( pbUpdFileName );

	/* Route link data file open				*/
	pOrgFile = fopen( pbUpdFileName, "rb" );
	if( NULL == pOrgFile )
	{
		printf( "\nFailed to open file GTBL.data.\n" );
		return RET_FAILED;
	}

	/* Temporary file create					*/
	pTmpFile = fopen( abTmpFileName, "wb" );
	if( NULL == pTmpFile )
	{
		fclose( pOrgFile );
		pOrgFile = NULL;

		printf( "Failed to create the temporary file!" );
		return RET_FAILED;
	}
	
	/* Memory block allocation					*/
	pbReadBlock = malloc( FILEREAD_BLOCKSIZE );
	if( NULL == pbReadBlock )
	{
		fclose( pOrgFile );
		pOrgFile = NULL;

		fclose( pTmpFile );
		pOrgFile = NULL;
		remove( abTmpFileName );
		return RET_FAILED;
	}
	else
	{
		memset( pbReadBlock, 0, FILEREAD_BLOCKSIZE );
	}


	/* Read file until the end of the file	*/
	while( 0 == feof( pOrgFile ) )
	{
		/* Memory clear							*/
		memset( pbReadBlock, 0, FILEREAD_BLOCKSIZE );

		/* Get current file read position		*/
		fgetpos( pOrgFile, &stFilePntr );

		/* The next block includes the data for updating	*/
		if( *pstFilePos == stFilePntr )
		{
			/* Read the record size of current link data from original file*/
			iRetReadFile = fread( pbReadBlock, RL_SIZE_RECSIZE, 1, pOrgFile );

			/* Get Record size and Link ID		*/
			uwRecSize = MC_GET_SHORT( pbReadBlock );
			
			/* Set file reading pointer to the end of current link data	   */
			fseek( pOrgFile, (uwRecSize - (RL_SIZE_RECSIZE)), SEEK_CUR );

			/* Get Record size of the new link data			*/
			uwNewRecSize = MC_GET_SHORT( pbLinkData );

			/* Write new link data into the temporary file	*/
			fwrite( pbLinkData, uwNewRecSize, 1, pTmpFile );
		}
		else
		{
			/* Calculate the size of data reading			*/
			if( ( *pstFilePos > stFilePntr ) && 
				(*pstFilePos - stFilePntr) < FILEREAD_BLOCKSIZE )
			{
				iReadSize = (int)(*pstFilePos - stFilePntr);
			}
			else
			{
				/* The left size is less than FILEREAD_BLOCKSIZE	*/
				if( (iOrgFileSize - stFilePntr) < FILEREAD_BLOCKSIZE )
				{
					iReadSize = (int)(iOrgFileSize - stFilePntr);
				}
				else
				{
					iReadSize = FILEREAD_BLOCKSIZE;
				}
			}

			/* Read data by the size specified from link data file	*/
			iRetReadFile = fread( pbReadBlock, iReadSize, 1, pOrgFile );
			if( iRetReadFile > 0 )
			{
				iFwrite = fwrite( pbReadBlock, iReadSize, 1, pTmpFile );
				if( iFwrite <= 0 )
				{
					printf( "\nWrite file failed!\n" );
					break;
				}
			}
			else
			{
				break;
			}
		}
	}

	/* File close							*/
	fclose( pOrgFile );
	pOrgFile = NULL;

	/* Route link data file reopen			*/
	pOrgFile = fopen( pbUpdFileName, "wb" );
	if( NULL == pOrgFile )
	{
		fclose( pTmpFile );
		pTmpFile = NULL;

		return RET_FAILED;
	}

	/* File pointer seek					*/
	if( NULL != pTmpFile )
	{
		fclose( pTmpFile );
		pTmpFile = fopen( abTmpFileName, "rb" );
		if( NULL == pTmpFile )
		{
			fclose( pOrgFile );
			pOrgFile = NULL;
		}
	}

	/* From temporary file into data file	*/
	while( 0 == feof( pOrgFile ) )
	{
		/* Get current file read position	*/
		fgetpos( pTmpFile, &stFilePntr );

		/* Get the size of original file	*/
		iTmpFileSize = routelink_getfsize( abTmpFileName );

		/* Size of block read from file		*/
		if( (iTmpFileSize - stFilePntr) < FILEREAD_BLOCKSIZE )
		{
			iReadSize = (int)(iTmpFileSize - stFilePntr);
		}
		else
		{
			iReadSize = FILEREAD_BLOCKSIZE;
		}

		/* Read the record size of current link data from original file*/
		iRetReadFile = fread( pbReadBlock, iReadSize, 1, pTmpFile );
		if( iRetReadFile > 0 )
		{
			fwrite( pbReadBlock, iReadSize, 1, pOrgFile );
		}
		else
		{
			break;
		}
	}

	/* Memory block free		*/
	if( NULL != pbReadBlock )
	{
		free( pbReadBlock );
		pbReadBlock = NULL;
	}

	/* File close				*/
	fclose( pOrgFile );
	pOrgFile = NULL;
	
	/* Temprary file close		*/
	fclose( pTmpFile );
	pTmpFile = NULL;

	/* Data file exchange		*/
	remove( abTmpFileName );

	return RET_SUCCESS;
}

/***************************************************************************/
/*	routelink_upd_chklnkid												   */
/*	-----------------------------------------------------------------------*/
/*	Input:																   */
/*		UDWORD				:	Link ID for the data updating[IN]		   */
/*		fpos_t*				:	Position of the linkdata being updated[OUT]*/
/*																		   */
/*	-----------------------------------------------------------------------*/
/*	Output:																   */
/*		RETURN				:	乮Normal乯Matched link data node number	   */
/*								乮Error乯 RET_FAILED					   */
/*																		   */
/*	-----------------------------------------------------------------------*/
/*	Outline:															   */
/*		Find the position of the link data to being updated.			   */
/*																		   */
/*	-----------------------------------------------------------------------*/
/*	Others:																   */
/*																		   */
/***************************************************************************/
int	routelink_upd_chklnkid(
	UDWORD			udwBaseLnkID,
					/* I / Link ID for the data updating				   */
	fpos_t*			pstFilePos,	 
					/* O / Position of the link data being updated		   */
	BYTE*			pbUpdFileName			
					/* IO/ File to be updated							   */
	)
{
	UWORD			uwRecSize	= 0;	/* Current Record size			   */
	UDWORD			udwLinkID	= 0;	/* Link ID						   */
	int				iRetReadFile= 0;	/* Return of read file			   */
	int				iSrcRsltNum = 0;	/* Search result				   */
	int				iMovSize	= 0;	/* Size of memory move			   */

	BYTE*			pbMemBlock	= NULL;	/* Memory Block for read from file */
	BYTE*			pbCurBlock	= NULL;	/* Current pointer to Memory Block */
	BYTE*			pbCatPos	= NULL;
	FILE*			pOrgFile	= NULL; /* File Handle					   */

	/* Exception prevention				*/
	if( (NULL == pbUpdFileName) || (NULL == pstFilePos) )
	{
		return RET_FAILED;
	}

	/* Route link data file open		*/
	pOrgFile = fopen( pbUpdFileName, "ab+" );
	if( NULL == pOrgFile )
	{
		printf( "\nOpen data file failed!\n" );
		return RET_FAILED;
	}

	/* Memory block allocation			*/
	pbMemBlock = malloc( FILEREAD_BLOCKSIZE );
	if( NULL == pbMemBlock )
	{
		fclose( pOrgFile );
		pOrgFile = NULL;

		return RET_FAILED;
	}
	else
	{
		memset( pbMemBlock, 0, FILEREAD_BLOCKSIZE );
		pbCatPos = pbMemBlock;
	}

	/* Read file until find the same ID	or until the end of file(not exist)*/
	while( 0 == feof( pOrgFile ) )
	{
		memset( pbCatPos, 0, (FILEREAD_BLOCKSIZE - iMovSize) );

		/* Current file pointer get							*/
		fgetpos( pOrgFile, pstFilePos );

		iRetReadFile = fread( pbCatPos, 
							(FILEREAD_BLOCKSIZE - iMovSize), 1, pOrgFile );
		pbCurBlock   = pbMemBlock;
		if( iRetReadFile > 0 )
		{
			while( (pbCurBlock + RL_SIZE_RECSIZE) < 
										(pbMemBlock + FILEREAD_BLOCKSIZE) )
			{
				/* Get Record size and Link ID				*/
				uwRecSize = MC_GET_SHORT( pbCurBlock );
				if( (pbCurBlock + uwRecSize) > 
										(pbMemBlock + FILEREAD_BLOCKSIZE) )
				{
					break;
				}
				udwLinkID = MC_GET_LONG( (pbCurBlock + RL_OFFSET_LNKID) );
				if( udwLinkID == udwBaseLnkID )
				{
					iSrcRsltNum++;

					/* The position of the data need to be updated		*/
					*pstFilePos += (pbCurBlock - pbCatPos);
					break;
				}

				/* Next record header address get			*/
				pbCurBlock += uwRecSize;
			}

			iMovSize = (pbMemBlock + (FILEREAD_BLOCKSIZE) - pbCurBlock);
			memcpy( pbMemBlock, pbCurBlock, iMovSize );
			pbCatPos = pbMemBlock + iMovSize;
		}
		else
		{
			break;
		}

		if( iSrcRsltNum > 0 )
		{
			break;
		}
	}

	/* Memory block free		*/
	if( NULL != pbMemBlock )
	{
		free( pbMemBlock );
		pbMemBlock = NULL;
	}


	/* File close				*/
	fclose( pOrgFile );
	pOrgFile = NULL;	


	/* Return the flag of match Link ID exist or not	*/
	return iSrcRsltNum;
	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -