?? c語言寫的.dbf文件的操作函數庫.txt
字號:
{
DBF_FIELD* field=con->head;
char field_type;
float rfloat;
unsigned char * temp;
char float_buf[MAX_FLOAT_LENTH+1];
while(field!=NULL)
{
if(field->index==index)
{
/*根據field的類型進行判斷,并生成合適的值返回*/
switch(field->FIELD_TYPE)
{
case 'F':
case 'N':
temp=(unsigned char *)record->value;
memcpy(float_buf,temp+field->FIELD_X,field->FIELD_LENTH);
float_buf[MAX_FLOAT_LENTH]='\0';
printf("float_buf:%0x\n",float_buf);
rfloat=atof(float_buf);
memcpy(return_value,(void *)&rfloat,4);
printf("rfloat:%f\n",rfloat);
break;
case 'C':
default:
if(return_value==NULL)
{
printf("return_value需要預先分配空間!\n");
return -1;
}
temp=(unsigned char *)record->value;
memcpy(return_value,temp+field->FIELD_X,field->FIELD_LENTH);
break;
}
return 0;
}
field=field->next;
}
printf("沒有此索引index=%d\n",index);
return -1;
}
int dbfgetFieldByName(DBF_CONFIG * con,DBF_RECORD * record,char* name,void * return_value)
{
DBF_FIELD* field=con->head;
char field_type;
int index=0;
while(field!=NULL)
{
if((field->FIELD_LENTH>0)&&(strncmpi(field->FIELD_NAME,name,strlen(name)<field->FIELD_LENTH?strlen(name):field->FIELD_LENTH)==0))
{
index=field->index;
break;
}
field=field->next;
}
if(index==0)
{
printf("沒有此列名稱name=%s\n",name);
return -2;
}
return dbfgetFieldByIndex(con,record,index,return_value);
}
/*特殊的針對Float-N,Float-F的讀取操作*/
/******************************************
*return 0:正確
* -1:沒有此索引
* -2:沒有此列名稱
* -3:類型不匹配!您試圖讀取非Float或int型字段
******************************************/
int dbfgetFloatByIndex(DBF_CONFIG * con,DBF_RECORD * record,int index,void * return_value)
{
DBF_FIELD* field=con->head;
char field_type;
while(field!=NULL)
{
if(field->index==index)
{
if(field->FIELD_TYPE=='N'||field->FIELD_TYPE=='F')
return dbfgetFieldByIndex(con,record,index,return_value);
else
{
printf("類型不匹配!您試圖用dbfgetFloatByIndex去讀取非Float或int型字段\n");
return -3;
}
}
field=field->next;
}
printf("沒有此索引index=%d\n",index);
return -1;
}
int dbfgetFloatByName(DBF_CONFIG * con,DBF_RECORD * record,char* name,void * return_value)
{
DBF_FIELD* field=con->head;
char field_type;
int index=0;
while(field!=NULL)
{
if((field->FIELD_LENTH>0)&&(strncmpi(field->FIELD_NAME,name,strlen(name)<field->FIELD_LENTH?strlen(name):field->FIELD_LENTH)==0))
{
if(field->FIELD_TYPE=='N'||field->FIELD_TYPE=='F')
{
index=field->index;
break;
}
else
{
printf("類型不匹配!您試圖用dbfgetFloatByName去讀取非Float或int型字段\n");
return -3;
}
}
field=field->next;
}
if(index==0)
{
printf("沒有此列名稱name=%s\n",name);
return -2;
}
return dbfgetFieldByIndex(con,record,index,return_value);
}
/*特殊的針對char-C或其他小于等于"MAX_CHAR_LENTH"個字符的串的讀取操作*/
/******************************************
*@return_value:必須在調用此函數前已經聲明并分配空間,一般可以定義為unsigned char ret[MAX_CHAR_LENTH+1];
* return 0:正確
* -1:沒有此索引
* -2:沒有此列名稱
******************************************/
int dbfgetCharByIndex(DBF_CONFIG * con,DBF_RECORD * record,int index,void * return_value)
{
return dbfgetFieldByIndex(con,record,index,return_value);
}
int dbfgetCharByName(DBF_CONFIG * con,DBF_RECORD * record,char* name,void * return_value)
{
return dbfgetFieldByName(con,record,name,return_value);
}
/******************************************
* 寫入DBF_RECORD相應的FIELD
* 目前僅支持C-char,N-float,F-float
* value 指向一個float或一個char型數組,若為數組則此數組一般為MAX_CHAR_LENTH長
* 但一定要大于等于field->FIELD_LENTH,可在數組末尾補齊空格0x20。
* return 0:正確
* -1:沒有此索引
* -2:沒有此列名稱
******************************************/
int dbfsetFieldByIndex(DBF_CONFIG * con,DBF_RECORD * record,int index,void * value)
{
DBF_FIELD* field=con->head;
char field_type;
unsigned char * temp;
/*以下用于float和int*/
float rfloat;
char f_length[3],f_f_length[3],f_format[10]={"%"};
char float_buf[MAX_FLOAT_LENTH+1];
/*以下用于char*/
unsigned char *temp2;
while(field!=NULL)
{
if(field->index==index)
{
/*根據field的類型進行判斷,并生成合適的值返回*/
switch(field->FIELD_TYPE)
{
case 'F':
case 'N':
rfloat=*(float *)value;
itoa(field->FIELD_LENTH,f_length,10);
itoa(field->FIELD_FLOAT_LENTH,f_f_length,10);
strcat(f_format,f_length);
strcat(f_format,".");
strcat(f_format,f_f_length);
strcat(f_format,"f");
sprintf(float_buf,f_format,rfloat);
temp=(unsigned char *)record->value;
memcpy(temp+field->FIELD_X,float_buf,field->FIELD_LENTH);
dbfwrite(con,record);
break;
case 'C':
default:
if(value==NULL)
{
printf("value未設定!\n");
return -1;
}
temp=(unsigned char *)record->value;
temp2=(unsigned char *)value;
memcpy(temp+field->FIELD_X,temp2,field->FIELD_LENTH);
dbfwrite(con,record);
break;
}
return 0;
}
field=field->next;
}
printf("沒有此索引index=%d\n",index);
return -1;
}
int dbfsetFieldByName(DBF_CONFIG * con,DBF_RECORD * record,char * name,void * value)
{
DBF_FIELD* field=con->head;
char field_type;
int index=0;
while(field!=NULL)
{
if((field->FIELD_LENTH>0)&&(strncmpi(field->FIELD_NAME,name,strlen(name)<field->FIELD_LENTH?strlen(name):field->FIELD_LENTH)==0))
{
index=field->index;
break;
}
field=field->next;
}
if(index==0)
{
printf("沒有此列名稱name=%s\n",name);
return -2;
}
return dbfsetFieldByIndex(con,record,index,value);
}
int dbfsetFloatByIndex(DBF_CONFIG * con,DBF_RECORD * record,int index,void * value)
{
DBF_FIELD* field=con->head;
char field_type;
while(field!=NULL)
{
if(field->index==index)
{
if(field->FIELD_TYPE=='N'||field->FIELD_TYPE=='F')
return dbfsetFieldByIndex(con,record,index,value);
else
{
printf("類型不匹配!您試圖用dbfgetFloatByIndex去寫入非Float或int型字段\n");
return -3;
}
}
field=field->next;
}
printf("沒有此索引index=%d\n",index);
return -1;
}
int dbfsetFloatByName(DBF_CONFIG * con,DBF_RECORD * record,char* name,void * value)
{
DBF_FIELD* field=con->head;
char field_type;
int index=0;
while(field!=NULL)
{
if((field->FIELD_LENTH>0)&&(strncmpi(field->FIELD_NAME,name,strlen(name)<field->FIELD_LENTH?strlen(name):field->FIELD_LENTH)==0))
{
if(field->FIELD_TYPE=='N'||field->FIELD_TYPE=='F')
{
index=field->index;
break;
}
else
{
printf("類型不匹配!您試圖用dbfgetFloatByName去寫入非Float或int型字段\n");
return -3;
}
}
field=field->next;
}
if(index==0)
{
printf("沒有此列名稱name=%s\n",name);
return -2;
}
return dbfsetFieldByIndex(con,record,index,value);
}
int dbfsetCharByIndex(DBF_CONFIG * con,DBF_RECORD * record,int index,void * value)
{
return dbfsetFieldByIndex(con,record,index,value);
}
int dbfsetCharByName(DBF_CONFIG * con,DBF_RECORD * record,char* name,void * value)
{
return dbfsetFieldByName(con,record,name,value);
}
void main()
{
dbf_info();
}
/************************************工具函數**********************************************/
char *ccstr( char *str)
{
char *tok = " ", *p;
p = strtok( str, tok );
while( p != NULL)
{
if( p != str )
strcat( str, p );
p = strtok( NULL, tok );
}
return( str );
}
3:結束
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -