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文件记录 结束 }


发布评论