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;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();
发布评论