// 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;
}