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

📄 c语言写的.dbf文件的操作函数库.txt

📁 为什么编写本函数库?   目前好多电力方面的抄表器由于其RAM内存及FLASH闪存的空间都比较小
💻 TXT
📖 第 1 页 / 共 2 页
字号:
{
 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 + -