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

我给你列出dbf的文件格式和c语言描述,对你而言应该足够了吧:

表文件由头记录及数据记录组成。

头记录定义该表的结构并包含与表相关的其他信息。头记录由文件位置 0 开始。

数据记录1紧接在头记录之后,包含字段中实际的文本。 记录的长度等于所有字段定义的长度之和。

表文件中存储整数时低位字节在前。

1.表头记录的结构:

字节偏移 说明 备注

0 文件类型 0x02 foxbase 0x03 foxbase+/dbase iii plus,无备注 0x30 visual foxpro 0x43 dbase iv sql 表文件,无备注 0x63 dbase iv sql 系统文件,无备注 0x83 foxbase+/dbase iii plus,有备注 0x8b

dbase iv 有备注 0xcb dbase iv sql 表文件,有备注 0xf5 foxpro 2.x有备注 0xfb foxbase

1 - 3 最近一次更新的时间

4 - 7 文件中的记录数目

8 - 9 第一个数据记录的位置

10 - 11 每个数据记录的长度

12 - 27 保留

28 表的标记 0x01 具有 .cdx 结构的文件 0x02 文件包含备注。 0x04 文件是数据库 请注意,这个字节可以包含任何上面值的和。例如,0x03 表明表具有结构化.cdx和一个备注字段。

29 代码页标记

30 - 31 保留,包含 0x00

32 - n 字段子记录 字段的数目决定了字段子记录的数目。表中每个字段都对应一个字段子记录。

n+1 头记录终止符

n+2- n+264 此范围内的 263 个字节包含后链信息 如果第一个字节为 0x00,则该文件不与数据库关联。

备注:头记录中的第 8 到第 9 个字节指示数据文件中数据的起始位置。数据记录从删除标记字节开始。如果此字节为 ascii 空格 (0x20),该记录没有删除标记, 如果第一字节为星号 (0x2a),该记录有删除标记。在标记之后是字段记录中所命名各字段中的数据

2.字段子记录结构

字节偏移 说明 备注

0 - 10 字段名 最多 10 个字符 -若少于 10 则用空字符 (0x00) 填充

11 字段类型 c-字符型 y-货币型 n-数值型 f-浮点

型 d-日期型 t-日期时间型 b-双精度型 i-整型 l-逻辑型 m-备注型 g-通用型 c-字符型 m-备注型 p-图片型

12 - 15 记录中该字段的偏移量

16 字段长度 以字节为单位

17 小数位数

18 字段标记 0x01系统列 0x02可存储 null 值的列 0x04二进制列

19 - 32 保留

格式保存的文件标头:

支持 null 值

日期时间型、货币型及双精度型数据

字符字段和备注字段标记为二进制

在数据库 (.dbc) 文件中添加表

提示:可以使用下面的公式求出表文件中字段的数目:(x - 296/32) 公式中,x 表示第一个记录的位置,296 表示 263+ 1+ 32,32 是字段子记录的长度。

因为dbf文件的记录在文件数据部分,都是用ascii码形式存放的,所以只要读出文件头和字段类型描述区的内容,就可以直接读取dbf文件中的每条记录,dbf文件头结构和字段类型描述结构用c语言表示如下:

struct dbf_head { /* dbf文件头结构 */

char vers; /* 版本标志*/

unsigned char yy,mm,dd; /* 最后更新年、月、日 */

unsigned long no_recs; /* 文件包含的总记录数 */

unsigned short head_len,rec_len; /* 文件头长度,记录长度 */

char reserved[20]; /* 保留 */

};

struct field_element{ /* 字段描述结构 */

char field_name[11]; /* 字段名称 */

char field_type; /* 字段类型 */

unsigned long offset; /* 偏移量 */

unsigned char field_length; /* 字段长度 */

unsigned char field_decimal; /* 浮点数整数部分长度 */

char reserved1[2]; /* 保留 */

char dbaseiv_id; /* dbase iv work area id

*/

char reserved2[10]; /*

char production_index;

};

发表者:zhang1000

以下是根据csdn上一个朋友(对不起,id忘记了:()提供的源代码稍做修改的结果:

/************************************************************************************

comments:dbf文件的总体格式

a.数据记录部分,紧随结构描述部分,以ascii码方式顺序存放,结束标志为1ah(即

文件结束标志),每条记录的首字节为删除标志,20h表示有效,2ah表示已被删除,

字段值间无分隔符,记录亦无结束标记.

b.结构描述部分,位于文件首部,以二进制方式存放,结束标志为0dh.长度

为32*(数据库的字段个数+1(即库整体描述))+1(0dh结束标志)

************************************************************************************/

#include

#include

#include

//dbf 文件头结构//即库整体描述表,共32个字节

typedef struct tagdbffileheader

{

unsigned char dfmark; //0x03h 或 0x80h(有memory字段) 0

unsigned char dfyear,dfmmonth,dfday; //依次为年月日,二进制

1-3

unsigned long dfrecordcount; //总记录个数,低位字节在前 4-7

unsigned short dfheaderlength; //文件头长度=第9字节值*256+第8字节值 8-9

unsigned short dfrecordlength; //记录长度=第11字节值*256+第10字节值 10-11

unsigned char dfreserved[20]; //保留 12-31

}dbffileheader;

//dbf 字段结构//即字段描述表,32个字节/字段

typedef struct tagdbfinfoheader

{

unsigned char difieldname[10]; //字段名称,ascii码 0-9

unsigned char direserved1; //保留字节 10

unsigned char difieldtype; //字段类型,cdnl等ascii码 11

unsigned long dioffset; //本字段在首记录中的位置 12-15

unsigned char difieldlength; //字段长度<=256 16

unsigned char didecimal; //小数点的位数 17

unsigned char direserved[14]; //保留 18-31

}dbfinfoheader;

typedef dbffileheader *lpdbffileheader;

typedef dbfinfoheader *lpdbfinfoheader;

/************************************************************************************

cdbffile class defination.

************************************************************************************/

class cdbffile

{

public:

cdbffile();

virtual ~cdbffile();

long initdbf(lpctstr lpszfilename); //填充fileheader和infoheader

int getfieldcount();

int getfieldlength(int fieldnum);

int getdecimal(int fieldnum);

unsigned char * getfieldname(int fieldnum);

unsigned char getfieldtype(int fieldnum);

long getrecordcount();

int getrecordlength();

int getrecord(int recordnum,unsigned char *pbuf);

int

getrecordfieldvalue(int recordnum,int fieldnum,unsigned char *pbuf);

unsigned long getfieldcolumsize(int fieldnum);

public:

unsigned char * m_buffer;

dbffileheader m_fileheader;

dbfinfoheader m_infoheader;

dword m_dwrecordlen;

};

发表者:onega

//=====================open dbf database file

#include "stdafx.h"

#import "c:program filescommon " no_namespace rename("eof", "endoffile")

int main(int argc, char* argv[])

{

printf("use ado to open c: database file!n");

coinitialize(null);

try

{

_connectionptr pconn("tion");

_recordsetptr prst("set");

pconn->open("driver={microsoft dbase driver (*.dbf)};dbq=c:tmp; driverid=533;"

,"","",adconnectunspecified);

prst->open("images", _variant_t((idispatch

*) pconn, true),

adopenstatic, adlockreadonly, adcmdtable);

fieldsptr fds=prst->getfields();

printf("printf field name of all the tablen");

for(int i=0;igetcount();i++)

{

fieldptr fd=fds->getitem(_variant_t(short(i)));

printf("%s ",(lpctstr)fd->getname());

}

printf("n");

prst->close();

pconn->close();

}

catch (_com_error &e)

{

printf("description = %sn", (char*)

ption());

}

::couninitialize();