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

📄 dbfopen.c

📁 包含详细例子的c#创建shape文件的开源码
💻 C
📖 第 1 页 / 共 4 页
字号:
DBFReadIntegerAttribute( DBFHandle psDBF, int iRecord, int iField ){    double	*pdValue;    pdValue = (double *) DBFReadAttribute( psDBF, iRecord, iField, 'N' );    if( pdValue == NULL )        return 0;    else        return( (int) *pdValue );}/************************************************************************//*                        DBFReadDateAttribute()                         *//*                                                                      *//*      Read a date attribute.                                      *//************************************************************************/int SHPAPI_CALLDBFReadDateAttribute( DBFHandle psDBF, int iRecord, int iField ){    double	*pdValue;    pdValue = (double *) DBFReadAttribute( psDBF, iRecord, iField, 'D' );    if( pdValue == NULL )        return 0;    else        return( (int) *pdValue );}/************************************************************************//*                        DBFReadDoubleAttribute()                      *//*                                                                      *//*      Read a double attribute.                                        *//************************************************************************/double SHPAPI_CALLDBFReadDoubleAttribute( DBFHandle psDBF, int iRecord, int iField ){    double	*pdValue;    pdValue = (double *) DBFReadAttribute( psDBF, iRecord, iField, 'N' );    if( pdValue == NULL )        return 0.0;    else        return( *pdValue );}/************************************************************************//*                        DBFReadStringAttribute()                      *//*                                                                      *//*      Read a string attribute.                                        *//************************************************************************/const char SHPAPI_CALL1(*)DBFReadStringAttribute( DBFHandle psDBF, int iRecord, int iField ){    return( (const char *) DBFReadAttribute( psDBF, iRecord, iField, 'C' ) );}/************************************************************************//*                        DBFReadLogicalAttribute()                     *//*                                                                      *//*      Read a logical attribute.                                       *//************************************************************************/const char SHPAPI_CALL1(*)DBFReadLogicalAttribute( DBFHandle psDBF, int iRecord, int iField ){    return( (const char *) DBFReadAttribute( psDBF, iRecord, iField, 'L' ) );}/************************************************************************//*                         DBFIsAttributeNULL()                         *//*                                                                      *//*      Return TRUE if value for field is NULL.                         *//*                                                                      *//*      Contributed by Jim Matthews.                                    *//************************************************************************/int SHPAPI_CALLDBFIsAttributeNULL( DBFHandle psDBF, int iRecord, int iField ){    const char	*pszValue;    pszValue = DBFReadStringAttribute( psDBF, iRecord, iField );    switch(psDBF->pachFieldType[iField])    {      case 'N':      case 'F':        /* NULL numeric fields have value "****************" */        return pszValue[0] == '*';      case 'D':        /* NULL date fields have value "00000000" */        return strncmp(pszValue,"00000000",8) == 0;      case 'L':        /* NULL boolean fields have value "?" */         return pszValue[0] == '?';      default:        /* empty string fields are considered NULL */        return (strlen(pszValue) == 0);    }}/************************************************************************//*                          DBFGetFieldCount()                          *//*                                                                      *//*      Return the number of fields in this table.                      *//************************************************************************/int SHPAPI_CALLDBFGetFieldCount( DBFHandle psDBF ){    return( psDBF->nFields );}/************************************************************************//*                         DBFGetRecordCount()                          *//*                                                                      *//*      Return the number of records in this table.                     *//************************************************************************/int SHPAPI_CALLDBFGetRecordCount( DBFHandle psDBF ){    return( psDBF->nRecords );}/************************************************************************//*                          DBFGetFieldInfo()                           *//*                                                                      *//*      Return any requested information about the field.               *//************************************************************************/DBFFieldType SHPAPI_CALLDBFGetFieldInfo( DBFHandle psDBF, int iField, char * pszFieldName,                 int * pnWidth, int * pnDecimals ){    if( iField < 0 || iField >= psDBF->nFields )        return( FTInvalid );    if( pnWidth != NULL )        *pnWidth = psDBF->panFieldSize[iField];    if( pnDecimals != NULL )        *pnDecimals = psDBF->panFieldDecimals[iField];    if( pszFieldName != NULL )    {	int	i;	strncpy( pszFieldName, (char *) psDBF->pszHeader+iField*32, 11 );	pszFieldName[11] = '\0';		for( i = 10; i > 0 && pszFieldName[i] == ' '; i-- )	    pszFieldName[i] = '\0';    }    if ( psDBF->pachFieldType[iField] == 'L' )		return( FTLogical);    else if( psDBF->pachFieldType[iField] == 'N' || psDBF->pachFieldType[iField] == 'F' )    {		if( psDBF->panFieldDecimals[iField] > 0 )			return( FTDouble );		else			return( FTInteger );    }    else if ( psDBF->pachFieldType[iField] == 'D' )		return (FTDate );	else		return( FTString );}/************************************************************************//*                         DBFWriteAttribute()                          *//*									*//*	Write an attribute record to the file.				*//************************************************************************/static int DBFWriteAttribute(DBFHandle psDBF, int hEntity, int iField,			     void * pValue ){    int	       	nRecordOffset, i, j, nRetResult = TRUE;    unsigned char	*pabyRec;    char	szSField[400], szFormat[20];/* -------------------------------------------------------------------- *//*	Is this a valid record?						*//* -------------------------------------------------------------------- */    if( hEntity < 0 || hEntity > psDBF->nRecords )        return( FALSE );    if( psDBF->bNoHeader )        DBFWriteHeader(psDBF);/* -------------------------------------------------------------------- *//*      Is this a brand new record?                                     *//* -------------------------------------------------------------------- */    if( hEntity == psDBF->nRecords )    {	DBFFlushRecord( psDBF );	psDBF->nRecords++;	for( i = 0; i < psDBF->nRecordLength; i++ )	    psDBF->pszCurrentRecord[i] = ' ';	psDBF->nCurrentRecord = hEntity;    }/* -------------------------------------------------------------------- *//*      Is this an existing record, but different than the last one     *//*      we accessed?                                                    *//* -------------------------------------------------------------------- */    if( psDBF->nCurrentRecord != hEntity )    {	DBFFlushRecord( psDBF );	nRecordOffset = psDBF->nRecordLength * hEntity + psDBF->nHeaderLength;	fseek( psDBF->fp, nRecordOffset, 0 );	fread( psDBF->pszCurrentRecord, psDBF->nRecordLength, 1, psDBF->fp );	psDBF->nCurrentRecord = hEntity;    }    pabyRec = (unsigned char *) psDBF->pszCurrentRecord;    psDBF->bCurrentRecordModified = TRUE;    psDBF->bUpdated = TRUE;/* -------------------------------------------------------------------- *//*      Translate NULL value to valid DBF file representation.          *//*                                                                      *//*      Contributed by Jim Matthews.                                    *//* -------------------------------------------------------------------- */    if( pValue == NULL )    {        switch(psDBF->pachFieldType[iField])        {          case 'N':          case 'F':	    /* NULL numeric fields have value "****************" */            memset( (char *) (pabyRec+psDBF->panFieldOffset[iField]), '*',                     psDBF->panFieldSize[iField] );            break;          case 'D':	    /* NULL date fields have value "00000000" */            memset( (char *) (pabyRec+psDBF->panFieldOffset[iField]), '0',                     psDBF->panFieldSize[iField] );            break;          case 'L':	    /* NULL boolean fields have value "?" */             memset( (char *) (pabyRec+psDBF->panFieldOffset[iField]), '?',                     psDBF->panFieldSize[iField] );            break;          default:            /* empty string fields are considered NULL */            memset( (char *) (pabyRec+psDBF->panFieldOffset[iField]), ' ',                     psDBF->panFieldSize[iField] );            break;        }        return TRUE;    }/* -------------------------------------------------------------------- *//*      Assign all the record fields.                                   *//* -------------------------------------------------------------------- */    switch( psDBF->pachFieldType[iField] )    {      case 'D':      case 'N':      case 'F':	if( psDBF->panFieldDecimals[iField] == 0 )	{            int	nWidth = psDBF->panFieldSize[iField];            if( sizeof(szSField)-2 < nWidth )                nWidth = sizeof(szSField)-2;	    sprintf( szFormat, "%%%dd", nWidth );	    sprintf(szSField, szFormat, (int) *((double *) pValue) );	    if( (int)strlen(szSField) > psDBF->panFieldSize[iField] )            {	        szSField[psDBF->panFieldSize[iField]] = '\0';                nRetResult = FALSE;            }	    strncpy((char *) (pabyRec+psDBF->panFieldOffset[iField]),		    szSField, strlen(szSField) );	}	else	{            int		nWidth = psDBF->panFieldSize[iField];            if( sizeof(szSField)-2 < nWidth )                nWidth = sizeof(szSField)-2;	    sprintf( szFormat, "%%%d.%df",                      nWidth, psDBF->panFieldDecimals[iField] );	    sprintf(szSField, szFormat, *((double *) pValue) );	    if( (int) strlen(szSField) > psDBF->panFieldSize[iField] )            {	        szSField[psDBF->panFieldSize[iField]] = '\0';                nRetResult = FALSE;            }	    strncpy((char *) (pabyRec+psDBF->panFieldOffset[iField]),		    szSField, strlen(szSField) );	}	break;      case 'L':        if (psDBF->panFieldSize[iField] >= 1  &&             (*(char*)pValue == 'F' || *(char*)pValue == 'T'))            *(pabyRec+psDBF->panFieldOffset[iField]) = *(char*)pValue;        break;      default:	if( (int) strlen((char *) pValue) > psDBF->panFieldSize[iField] )        {	    j = psDBF->panFieldSize[iField];            nRetResult = FALSE;        }	else        {            memset( pabyRec+psDBF->panFieldOffset[iField], ' ',                    psDBF->panFieldSize[iField] );	    j = strlen((char *) pValue);        }	strncpy((char *) (pabyRec+psDBF->panFieldOffset[iField]),		(char *) pValue, j );	break;    }    return( nRetResult );}/************************************************************************//*                     DBFWriteAttributeDirectly()                      *//*                                                                      *//*      Write an attribute record to the file, but without any          *//*      reformatting based on type.  The provided buffer is written     *//*      as is to the field position in the record.                      *//************************************************************************/int SHPAPI_CALL	DBFWriteAttributeDirectly(DBFHandle psDBF, int hEntity, int iField,                              void * pValue ){    int	       	nRecordOffset, i, j;    unsigned char	*pabyRec;/* -------------------------------------------------------------------- *//*	Is this a valid record?						*//* -------------------------------------------------------------------- */    if( hEntity < 0 || hEntity > psDBF->nRecords )        return( FALSE );    if( psDBF->bNoHeader )        DBFWriteHeader(psDBF);/* -------------------------------------------------------------------- *//*      Is this a brand new record?                                     *//* -------------------------------------------------------------------- */    if( hEntity == psDBF->nRecords )    {	DBFFlushRecord( psDBF );	psDBF->nRecords++;

⌨️ 快捷键说明

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