DBF文件结构中文说明.docx
- 文档编号:12320525
- 上传时间:2023-06-05
- 格式:DOCX
- 页数:13
- 大小:18.54KB
DBF文件结构中文说明.docx
《DBF文件结构中文说明.docx》由会员分享,可在线阅读,更多相关《DBF文件结构中文说明.docx(13页珍藏版)》请在冰点文库上搜索。
DBF文件结构中文说明
标准的DBF文件,是由头文件和实体信息两部分构成(如图所示)。
文件头
记录1
记录2
记录3
记录4
……
……
记录n
DBF文件的结构
1) 文件的文件头
其中文件头部分的长度是不定长的,它主要对DBF文件作了一些总体说明(表),其中最主要的是对这个DBF文件的记录项的信息进行了详细地描述,比如对每个记录项的名称、数据类型、长度等信息都有具体的说明。
在文件中的位置
内容
说明
0
1个字节
表示当前的版本信息
1-3
3个字节
表示最近的更新日期,按照YYMMDD格式。
4-7
1个32位数
文件中的记录条数。
8-9
1个16位数
文件头中的字节数。
10-11
1个16位数
一条记录中的字节长度。
12-13
2个字节
保留字节,用于以后添加新的说明性信息时使用,这里用0来填写。
14
1个字节
表示未完成的操作。
15
1个字节
dBASEIV编密码标记。
16-27
12个字节
保留字节,用于多用户处理时使用。
28
1个字节
DBF文件的MDX标识。
在创建一个DBF表时,如果使用了MDX格式的索引文件,那么DBF表的表头中的这个字节就自动被设置了一个标志,当你下次试图重新打开这个DBF表的时候,数据引擎会自动识别这个标志,如果此标志为真,则数据引擎将试图打开相应的MDX文件。
29
1个字节
LanguagedriverID.
30-31
2个字节
保留字节,用于以后添加新的说明性信息时使用,这里用0来填写。
32-X
(n*32)个字节
记录项信息描述数组。
n表示记录项的个数。
这个数组的结构在表2.8中有详细的解释。
X+1
1个字节
作为记录项终止标识。
文件(.dbf)的文件头
位置
内容
说明
0-10
11个字节
记录项名称,是ASCII码值。
11
1个字节
记录项的数据类型,是ASCII码值。
(B、C、D、G、L、M和N,具体的解释见表2.9)。
12-15
4个字节
记录中该字段的偏移量。
16
1个字节
记录项长度,二进制型。
17
1个字节
记录项的精度,二进制型。
20
1个字节
工作区ID。
21-30
10个字节
保留字节,用于以后添加新的说明性信息时使用,这里用0来填写。
31
1个字节
MDX标识。
如果存在一个MDX格式的索引文件,那么这个记录项为真,否则为空。
记录项信息描述
代码
数据类型
允许输入的数据
B
二进制型双精度型
各种字符。
C
字符型
各种字符。
D
日期型
用于区分年、月、日的数字和一个字符,内部存储按照YYYYMMDD格式。
G
(GeneralorOLE)通用类型
各种字符。
N
数值型(Numeric)
-.0123456789
L
逻辑型(Logical)
?
YyNnTtFf(?
表示没有初始化)。
M
(Memo)
各种字符。
Y
货币型
F
浮点型
I
整形
P
图片
表2.9dbf文件中的数据类型
2) 文件的实体信息
实体信息部分就是一条条记录,每条记录都是由若干个记录项构成,因此只要依次循环读取每条记录就可以了。
3) 一个读取dbf文件的例子
假设要读取一个名为soil的dbf文件(存储了土地利用信息),它含有8个记录项,记录项信息如表所示:
记录项名称
数据类型
长度
小数位数
Area
数值型(double)
31
15
Perimeter
数值型(double)
31
15
soils_
数值型(int)
11
0
soils_id
数值型(int)
11
0
soil_code
字符型(character)
3
无
Suit
字符型(character)
1
无
Centroid_x
数值型(double)
31
15
Centroid_y
数值型(double)
31
15
dbf文件中的数据类型
2、行情文件格式
说明:
(1)、表文件由头记录及数据记录组成。
头记录定义该表的结构及与表相关的其他信息。
数据记录紧接在头记录之后,包含字段中实际的文本。
记录的长度等于所有字段定义的长度之和(以字节为单位)。
(2)、头记录以终止符(0x0D)结束,数据记录以终止符(0x1A)结束。
(3)、表文件中存储整数时低位字节在前。
(4)、数据记录从删除标记字节开始。
如果删除标记字节为 ASCII 空格 (0x20),则表示该记录未被删除,如果该字节为星号(0x2A),则表示该记录被删除。
在删除标记之后是字段记录中所命名的各字段的数据。
(5)、数据记录都是用ASCII码形式存放的,所以只要读出文件头和字段类型描述区的内容,就可以直接读取dbf文件中的每条记录。
文件头部结构(32字节)
位置
长度
含义
备注
0
1
文件类型
0x03,FoxBASE+/dBASEIIIPLUS,无备注
1-3
3
最近一次更新的时间(YYMMDD)
4-7
4
文件中的记录数目
8-9
2
文件中的第一个数据记录的位置
10-11
2
每个数据记录的长度(包括删除标记)
12-31
20
保留
32-n 字段子记录
字段的数目决定了字段子记录的数目。
字段记录结构(32字节)
位置
长度
说明
备注
0-10
11
字段名
最多10个字符,若少于10则用空字符填充
11
1
字段类型
C-字符型
Y-货币型
N-数值型
F-浮点型
D-日期型
T-日期时间型
B-双精度型
I-整型
L-逻辑型
M-备注型
G-通用型
C-字符型(二进制)
M-备注型(二进制)
P-图片型
12-15
4
记录中该字段的偏移量(16进制)
16
1
字段长度
以字节为单位
17
1
小数位数
以字节为单位
18-31
14
保留
n+1头记录终止符(0x0D),n+2到n+264此范围内的263个字节包含后链信息(相关数据库(.dbc)的相对路径)。
如果第一个字节为0x00,则该文件不与数据库关联。
因此数据库文件本身总是包含0x00。
数据记录从除标记字节开始。
如果此字节为ASCII空格(0x20),该记录没有删除标记,如果第一字节为星号(0x2A),该记录有删除标记。
在标记之后是字段记录中所命名各字段中的数据
下面是读取这个dbf文件的代码:
voidOnReadDbf(CStringDbfFileName)
{
FILE* m_DbfFile_fp; //****Dbf文件指针
//打开dbf文件
if((m_DbfFile_fp=fopen(DbfFileName,"rb"))==NULL)
{
return;
}
inti,j;
//////****读取dbf文件的文件头 开始
BYTEversion;
fread(&version, 1, 1,m_DbfFile_fp);
BYTEdate[3];
for(i=0;i<3;i++)
{
fread(date+i, 1, 1,m_DbfFile_fp);
}
intRecordNum; //******
fread(&RecordNum, sizeof(int), 1,m_DbfFile_fp);
shortHeaderByteNum;
fread(&HeaderByteNum, sizeof(short),1,m_DbfFile_fp);
shortRecordByteNum
fread(&RecordByteNum, sizeof(short),1,m_DbfFile_fp);
shortReserved1;
fread(&Reserved1, sizeof(short),1,m_DbfFile_fp);
BYTEFlag4s;
fread(&Flag4s, sizeof(BYTE), 1,m_DbfFile_fp);
BYTEEncrypteFlag;
fread(&EncrypteFlag, sizeof(BYTE), 1,m_DbfFile_fp);
for(i=0;i<3;i++)
{
fread(&Unused, sizeof(int), 1,m_DbfFile_fp);
}
BYTEMDXFlag;
fread(&MDXFlag, sizeof(BYTE), 1,m_DbfFile_fp);
BYTELDriID;
fread(&LDriID, sizeof(BYTE), 1,m_DbfFile_fp);
shortReserved2;
fread(&Reserved2, sizeof(short),1,m_DbfFile_fp);
BYTEname[11];
BYTEfieldType;
intReserved3;
BYTEfieldLength;
BYTEdecimalCount;
shortReserved4;
BYTEworkID;
shortReserved5[5];
BYTEmDXFlag1;
intfieldscount;
fieldscount=(HeaderByteNum-32)/32;
//读取记录项信息-共有8个记录项
for(i=0;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); } BYTEterminator; fread(&terminator, sizeof(BYTE),1,m_DbfFile_fp); //读取dbf文件头结束 doubleArea,Perimeter,Centroid_y,Centroid_x; intSoils_,Soils_id; CStringSoil_code,suit; BYTE deleteFlag; charmedia[31]; //读取dbf文件记录 开始 for(i=0;i { fread(&deleteFlag, sizeof(BYTE),1,m_DbfFile_fp); //读取Areadouble for(j=0;j<31;j++) fread(media+j,sizeof(char),1,m_DbfFile_fp); Area=atof(media); //读取Perimeterdouble 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_codestring 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; //读取suitstring 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_ydouble 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_xdouble 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文件记录 结束 }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DBF 文件 结构 中文 说明