📄 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 + -