2023年12月18日发(作者:)

标准的DBF文件,是由头文件和实体信息两部分构成(如图所示)。

文件头

记录1

记录2

记录3

记录4

……

……

记录n

DBF文件的结构

1)

文件的文件头

其中文件头部分的长度是不定长的,它主要对DBF文件作了一些总体说明(表),其中最主要的是对这个DBF文件的记录项的信息进行了详细地描述,比如对每个记录项的名称、数据类型、长度等信息都有具体的说明。

在文件中的位置

0

1-3

4-7

8-9

10-11

12-13

14

15

16-27

28

内容

1个字节

3个字节

表示当前的版本信息

表示最近的更新日期,按照YYMMDD格式。

说明

1个32位数

文件中的记录条数。

1个16位数

文件头中的字节数。

1个16位数

一条记录中的字节长度。

2个字节

1个字节

1个字节

12个字节

1个字节

保留字节,用于以后添加新的说明性信息时使用,这里用0来填写。

表示未完成的操作。

dBASE IV编密码标记。

保留字节,用于多用户处理时使用。

DBF文件的MDX标识。在创建一个DBF 表时 ,如果使用了MDX 格式的索引文件,那么 DBF 表的表头中的这个字节就自动被设置了一个标志,当你下次试图重新打开这个DBF表的时候,数据引擎会自动识别这个标志,如果此标志为真,则数据引擎将试图打开相应的MDX 文件。

Language driver ID.

保留字节,用于以后添加新的说明性信息时使用,这里用0来填写。

记录项信息描述数组。n表示记录项的个数。这个数组的结构在表2.8中有详细的解释。

作为记录项终止标识。

文件(.dbf)的文件头

29

30-31

32-X

X+1

1个字节

2个字节

(n*32)个字节

1个字节

位置

0-10

11

12-15

16

17

18-19

20

21-30

31

内容

1个字节

4个字节

1个字节

1个字节

2个字节

1个字节

说明

记录项的数据类型,是ASCII码值。(B、C、D、G、L、M和N,具体的解释见表2.9)。

保留字节,用于以后添加新的说明性信息时使用,这里用0来填写。

记录项长度,二进制型。

记录项的精度,二进制型。

保留字节,用于以后添加新的说明性信息时使用,这里用0来填写。

工作区ID。

11个字节

记录项名称,是ASCII码值。

10个字节

保留字节,用于以后添加新的说明性信息时使用,这里用0来填写。

1个字节

MDX标识。如果存在一个MDX 格式的索引文件,那么这个记录项为真,否则为空。

记录项信息描述

代码

B

C

D

G

数据类型

二进制型

字符型

日期型

各种字符。

各种字符。

允许输入的数据

用于区分年、月、日的数字和一个字符,内部存储按照YYYYMMDD格式。

(General

各种字符。

or OLE)

N

L

M

数值型(Numeric)

- . 0 1 2 3 4 5 6 7 8 9

逻辑型? Y y N n T t F f (? 表示没有初始化)。

(Logical)

(Memo)

各种字符。

表2.9 dbf文件中的数据类型

2)

文件的实体信息

实体信息部分就是一条条记录,每条记录都是由若干个记录项构成,因此只要依次循环读取每条记录就可以了。

3)

一个读取dbf文件的例子

假设要读取一个名为soil的dbf文件(存储了土地利用信息),它含有8个记录项,记录项信息如表所示:

记录项名称

Area

Perimeter

soils_

soils_id

soil_code

Suit

Centroid_x

Centroid_y

数据类型

数值型(double)

数值型(double)

数值型(int)

数值型(int)

字符型(character)

字符型(character)

数值型(double)

数值型(double)

长度

31

31

11

11

3

1

31

31

小数位数

15

15

0

0

15

15

dbf文件中的数据类型

下面是读取这个dbf文件的代码:

void OnReadDbf(CString DbfFileName)

{

FILE* m_DbfFile_fp; //****Dbf文件指针

//打开dbf文件

if((m_DbfFile_fp=fopen(DbfFileName,"rb"))==NULL)

{

return;

}

int i,j;

//////****读取dbf文件的文件头 开始

BYTE version;

fread(&version, 1, 1,m_DbfFile_fp);

BYTE date[3];

for(i=0;i<3;i++)

{

fread(date+i, 1, 1,m_DbfFile_fp);

}

int RecordNum; //******

fread(&RecordNum, sizeof(int), 1,m_DbfFile_fp);

short HeaderByteNum;

fread(&HeaderByteNum, sizeof(short), 1,m_DbfFile_fp);

short RecordByteNum

fread(&RecordByteNum, sizeof(short), 1,m_DbfFile_fp);

short Reserved1;

fread(&Reserved1, sizeof(short), 1,m_DbfFile_fp);

BYTE Flag4s;

fread(&Flag4s, sizeof(BYTE), 1,m_DbfFile_fp);

BYTE EncrypteFlag;

fread(&EncrypteFlag, sizeof(BYTE), 1,m_DbfFile_fp);

for(i=0;i<3;i++)

{

fread(&Unused, sizeof(int), 1,m_DbfFile_fp);

}

BYTE MDXFlag;

fread(&MDXFlag, sizeof(BYTE), 1,m_DbfFile_fp);

BYTE LDriID;

fread(&LDriID, sizeof(BYTE), 1,m_DbfFile_fp);

short Reserved2;

fread(&Reserved2, sizeof(short), 1,m_DbfFile_fp);

BYTE name[11];

BYTE fieldType;

int Reserved3;

BYTE fieldLength;

BYTE decimalCount;

short Reserved4;

BYTE workID;

short Reserved5[5];

BYTE mDXFlag1;

int fieldscount;

fieldscount = (HeaderByteNum - 32) / 32;

//读取记录项信息-共有8个记录项

for(i=0;i< HeaderByteNum;i++)

{

//FieldName----11 bytes

fread(name, 11, 1,m_DbfFile_fp);

//FieldType----1 bytes

fread(&fieldType, sizeof(BYTE), 1,m_DbfFile_fp);

//Reserved3----4 bytes

Reserved3 =0;

fread(&Reserved3, sizeof(int), 1,m_DbfFile_fp);

//FieldLength--1 bytes

fread(&fieldLength,sizeof(BYTE), 1,m_DbfFile_fp);

//DecimalCount-1 bytes

fread(&decimalCount,sizeof(BYTE), 1,m_DbfFile_fp);

//Reserved4----2 bytes

Reserved4 =0;

fread(&Reserved4, sizeof(short), 1,m_DbfFile_fp);

//WorkID-------1 bytes

fread(&workID, sizeof(BYTE), 1,m_DbfFile_fp);

//Reserved5----10 bytes

for(j=0;j<5;j++)

{

fread(Reserved5+j,sizeof(short), 1,m_DbfFile_fp);

}

//MDXFlag1-----1 bytes

fread(&mDXFlag1, sizeof(BYTE), 1,m_DbfFile_fp);

}

BYTE terminator;

fread(&terminator, sizeof(BYTE), 1,m_DbfFile_fp);

//读取dbf文件头结束

double Area,Perimeter,Centroid_y,Centroid_x;

int Soils_,Soils_id;

CString Soil_code,suit;

BYTE deleteFlag;

char media[31];

//读取dbf文件记录 开始

for(i=0;i

{

fread(&deleteFlag, sizeof(BYTE), 1,m_DbfFile_fp);

//读取 Area double

for(j=0;j<31;j++)

fread(media+j, sizeof(char), 1,m_DbfFile_fp);

Area =atof(media);

//读取 Perimeter double

for(j=0;j<31;j++)

fread(media+j, sizeof(char), 1,m_DbfFile_fp);

Perimeter =atof(media);

//读取 soils_ int

for(j=0;j<31;j++)

strcpy(media+j,"");

for(j=0;j<11;j++)

fread(media+j, sizeof(char), 1,m_DbfFile_fp);

Soils_ =atoi(media);

//读取 Soils_id int

for(j=0;j<31;j++)

strcpy(media+j,"");

for(j=0;j<11;j++)

fread(media+j, sizeof(char), 1,m_DbfFile_fp);

Soils_id =atoi(media);

//读取 soil_code string

for(j=0;j<31;j++)

strcpy(media+j,"");

for(j=0;j<3;j++)

fread(media+j, sizeof(char), 1,m_DbfFile_fp);

Soil_code =media;

//读取 suit string

for(j=0;j<31;j++)

strcpy(media+j,"");

for(j=0;j<1;j++)

fread(media+j, sizeof(char), 1,m_DbfFile_fp);

suit =media;

//读取 Centroid_y double

for(j=0;j<31;j++)

strcpy(media+j,"");

for(j=0;j<31;j++)

fread(media+j, sizeof(char), 1,m_DbfFile_fp);

Centroid_y =atof(media);

//读取 Centroid_x double

for(j=0;j<31;j++)

strcpy(media+j,"");

for(j=0;j<31;j++)

fread(media+j, sizeof(char), 1,m_DbfFile_fp);

Centroid_x =atof(media);

}

//读取dbf文件记录 结束

}