CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C++ 语言

如何用C++编程读取dbf文件中的内容

楼主whitepigeon(白鸽)2003-08-01 17:45:48 在 C/C++ / C++ 语言 提问

如何用C++编程读取dbf文件中的内容,再将之写到txt文本文件中去  
  dbf中的一行就是文本中的一行,每个字段用空格符分开  
  请诸位高手多多指教! 问题点数:80、回复次数:8Top

1 楼Beover1984(摇滚人生)回复于 2003-08-01 22:27:30 得分 0

那得去问ADOBE了Top

2 楼mickwang(*pMick)回复于 2003-08-01 23:21:35 得分 0

呵呵,是dbf不是pdf,问adobe干啥?  
  可以通过odbc来连接  
  记得有本书上写过用c直接访问dbf的  
  google搜搜看看吧  
  Top

3 楼yakai(日落长河)回复于 2003-08-02 11:25:44 得分 10

用ADO应该也可以的吧,ODBC用起来麻烦一些的Top

4 楼cityvagrant(城市过客)回复于 2003-08-02 12:52:38 得分 0

用ADO吧,很方便的。可看看<ADO编程指南>,一学就会了。呵呵!Top

5 楼pushser(捕食者)回复于 2003-08-02 13:07:18 得分 0

ADO/ADO.netTop

6 楼chengroad(路在脚下。。。)回复于 2003-08-02 13:07:31 得分 20

首先得熟悉dbf文件得格式才行,文件开始有关于后面得记录数据结构得描述,如每个记录有多少个字段、各字段长度、总记录数、记录起始地址等。知道这些后将每条记录得数据读出转换为你需要得形式后写入txt文件就可以了Top

7 楼chengroad(路在脚下。。。)回复于 2003-08-02 13:09:39 得分 0

当然用ODBC   ADO等也可以实现,且方便得多Top

8 楼made_in_(有点疲惫)回复于 2003-08-02 13:26:19 得分 50

主要在于分析的2进制结构。  
   
  DBF文件由头记录及数据记录组成。头记录定义该表的结构并包含与表相关的其他信息。头记录由文件位置   0   开始。数据记录1紧接在头记录之后(连续的字节),包含字段中实际的文本。      
  记录的长度(以字节为单位)等于所有字段定义的长度之和。表文件中存储整数时低位字节在前。      
  1.表头记录的结构:      
  字节偏移   说明      
  0   文件类型      
  0x02FoxBASE      
  0x03FoxBASE+/dBASE   III   PLUS,无备注      
  0x30Visual   FoxPro      
  0x43dBASE   IV   SQL   表文件,无备注      
  0x63dBASE   IV   SQL   系统文件,无备注      
  0x83FoxBASE+/dBASE   III   PLUS,有备注      
  0x8BdBASE   IV   有备注      
  0xCBdBASE   IV   SQL   表文件,有备注      
  0xF5FoxPro   2.x(或更早版本)有备注      
  0xFBFoxBASE      
  1   -   3   最近一次更新的时间(YYMMDD)      
  4   -   7   文件中的记录数目      
  8   -   9   第一个数据记录的位置      
  10   -   11   每个数据记录的长度(包括删除标记)      
  12   -   27   保留      
  28   表的标记      
  0x01具有   .cdx   结构的文件      
  0x02文件包含备注。      
  0x04文件是数据库(.dbc)      
  请注意,这个字节可以包含任何上面值的和。例如,0x03   表明表具有结构化.cdx和一个备注字段。    
  29   代码页标记    
  30   -   31   保留,包含   0x00      
  32   -   n   字段子记录      
  字段的数目决定了字段子记录的数目。表中每个字段都对应一个字段子记录。      
  n+1   头记录终止符(0x0D),n+2   到   n+264   此范围内的   263   个字节包含后链信息(相关数据库   (.dbc)   的相对路径)。如果第一个字节为   0x00,则该文件不与数据库关联。因此数据库文件本身总是包含   0x00。      
  1   头记录中的第   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   表示第一个记录的位置(表头记录的第   8   到第   9   个字节),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;      
  };    
  需要注意的是,输入的dbf文件是FoxPro   2.5   for   DOS/Windows的版本,文件头中表示记录数等内容的unsigned   long和unsigned   short字段,寻址顺序是从高位到低位;而C程序在HP-UX操作系统下编译时,HP服务器使用的RISC   CPU的寻址顺序与Intel   x86系列CPU的寻址顺序相反,是从低位到高位,故程序中需要将读取的unsigned   long和unsigned   short进行反转操作,可以使用位操作编程实现:    
  void   revert_unsigned_short(unsigned   short   *a)    
  {    
  unsigned   short   left,right;    
  left=right=*a;    
  *a=((left&0x00ff)<<8)|((right&0xff00)>>8);    
  }    
  void   revert_unsigned_long(unsigned   long   *a)    
  {    
  unsigned   long   first,second,third,forth;    
  first=second=third=forth=*a;    
  *a=((first&0x000000ff)<<24)|    
  ((second&0x0000ff00)<<8)|    
  ((third&0x00ff0000)>>8)|    
  ((forth&0xff000000)>>24);    
  }    
   
   
  http://www.gdsoftpark.com/chs/TechCenter/Articles/Catalog/showpage.asp?PageID=1948上的格式更清晰点。  
  Top

相关问题

  • session 读取(C#)
  • linux下的c编程一问:怎样读取文件的最后一行并修改?
  • linux c编程:怎么从键盘只读取一个字符就返回,不要回车后才返回
  • C#中用到FTP协议编程,从服务器上读取和上传文件...有没有相关的类?
  • ****************怎样用c#编程实现读取视频文件的某桢的图象?帮顶有分!***********
  • oracle&unix-c编程
  • 读取.dbf文件
  • 编程读取注册表问题
  • c++编程思想
  • C高级编程?

关键词

  • c++编程
  • 字段
  • 文件
  • 二进制
  • 数据
  • 字符
  • 结构
  • 数据库
  • 内容
  • 记录

得分解答快速导航

  • 帖主:whitepigeon
  • yakai
  • chengroad
  • made_in_

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo