// jxdbf.cpp : 定义控制台应用程序的入口点。
//
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#define stru_name_beg 32
#define stru_type_idx stru_name_beg+11
#define stru_len_idx stru_name_beg+16
#define max 256
//以D:\\123.DBF为例 进行数据结构分析
int main(int argc, char* argv[])
{
struct stru_dbf
{
char name[12];
char type[2];
int len;
}*pdbfstru;
pdbfstru=(stru_dbf *)malloc(sizeof(stru_dbf)*max);
int i,j;
for(i=0;i<max;i++)
for(j=0;j<12;j++)
pdbfstru[i].name[j]='\0'; //初始化
for(i=0;i<max;i++)
for(j=0;j<2;j++)
pdbfstru[i].type[j]='\0'; //初始化
FILE* pfile = fopen ("d:\\123.dbf", "rb" );
//扫描第一0D数据
char tmp[2]={'\0'};
int itmp=0;
fseek (pfile ,0, SEEK_SET);
while(!feof(pfile))
{
fread(tmp,sizeof(char),1,pfile);
itmp++;
if(tmp[0]==13) break;
}
int field_beg=itmp-1+264;
rewind(pfile);
//以下扫描数据结构体
int idx=0;
int rds=0;
printf("%10s %2s %4s \n","字段名称","字段类型","字段长度");
while(1)
{
idx+=stru_name_beg;
fseek (pfile ,idx, SEEK_SET);
fread(pdbfstru[rds].name,sizeof(char),11,pfile);
if(pdbfstru[rds].name[0]=='\0') break;
fread(pdbfstru[rds].type,sizeof(char),1,pfile);
if(pdbfstru[rds].type[0]=='\0') break;
fseek (pfile ,idx+16, SEEK_SET);
fread(&pdbfstru[rds].len,sizeof(int),1,pfile);
rds++;
}
for(i=0;i<rds;i++) printf("%10s %8s %8d \n",pdbfstru[i].name,pdbfstru[i].type,pdbfstru[i].len);
//以下扫描记录结构体
printf("******以下显示具体记录******\n");
for(i=0;i<rds;i++)
{
printf("%10s",pdbfstru[i].name);
}
printf("\n");
char buffer[max*4]={'\0'};
int buf=0;
idx=field_beg;
while(1)
{
fseek (pfile ,idx, SEEK_SET);
for(i=0;i<rds;i++)
{
if(i<=rds-2) //前面的字段
{
if(pdbfstru[i].type[0]=='C')
{
fread(buffer,sizeof(char),pdbfstru[i].len,pfile);
printf("%10s",buffer);
memset(buffer,'\0',sizeof(buffer));
}
if(pdbfstru[i].type[0]=='N')
{
fread(buffer,sizeof(char),pdbfstru[i].len,pfile);
printf("%10s",buffer);
memset(buffer,'\0',sizeof(buffer));
}
}
else //最后一个字段
{
if(pdbfstru[i].type[0]=='C')
{
fread(buffer,sizeof(char),pdbfstru[i].len+1,pfile);
printf("%10s",buffer);
memset(buffer,'\0',sizeof(buffer));
}
if(pdbfstru[i].type[0]=='N')
{
fread(buffer,sizeof(char),pdbfstru[i].len+1,pfile);
printf("%10s",buffer);
memset(buffer,'\0',sizeof(buffer));
}
}
}
printf("\n");
idx+=26;
buf++;
if(buf>31) break;
}
//关闭文件,释放内存等收尾工作
free(pdbfstru);
fclose(pfile);
return 0;
}