能自由阅读两种不同结构数据库的小工具

Author: 求知 Date: 1997-01-01

  因为工作上的需要,我经常要查寻硬盘上的数据库,其中一些程序是以前用Foxbase编制的,虽然现在我已经改用Visual Foxpro 3.0 for Windows了,但为了与以前的数据库及基层单位的库衔接上,DOS下的程序还是没有改动。
  如果要对两种不同版本的数据库进行查寻,总免不了要在DOS和Windows两种状态之间进进出出,而且还要反复进入Foxbase和Foxpro环境。总感觉太麻烦了,也太浪费时间,于是我自编了一个可同时看两种版本数据库的小工具,用了一年多,感觉很好,因此奉献出来,好让大家也方便方便。
  由于版面关系,我在这里只列出了大家常用的字符型和数值型两种数据的读法,其它几种数据的读法留给各位读者,做为一个小小的启发吧。
  下面这个小工具就叫VIEW-DBF.C吧!
#3  使用方法为:VIEW-DBF 欲查寻的库名
  #include "stdio.h"
  main(argc,argv)
  int argc;
  char *argv[];
  {FILE *fp;/*定义指针*/
  char str[11],s,*zdm[128][11],jl[128];/*定义字段名及记录内容的数组*/
  long int i=1,j=1,*zdc[128],l=1,bbh,ls;/*定义字段长度及各计数器变量*/
  if((fp=fopen(argv[1],"a+b"))==NULL){
  printf("不能打开文件\n");
  exit(1);}else
  {bbh=getc(fp);/*从打开的文件中读字符,检测版本号,如果是Foxbase的库则bbh为03,如果是Foxpro for Windows的库则bbh为30*/
  fseek(fp,32L,0);/*跳过库文件头,直接找各字段名*/
  if(getc(fp)!=0x0D)/*找第一个字段名*/
  {fseek(fp,-1L,1);/*指到地址0处,读第一个字段名*/
  fgets(zdm[i],11,fp);
  fseek(fp,6L,1);/*查找第一个字段的长度*/
  zdc[i]=fgetc(fp)+1;/*读单字节,把字段长度赋予数组*/}
  while((s!=0x0d)&&!feof(fp)){/*依次找其它字段名*/
  i=i+1;
  fseek(fp,15L,1);/*找第一个字节,看是否为0x0D,因为0D是字段名与各记录之间的分界标志*/
  s=fgetc(fp);
  fseek(fp,-1L,1);/*返回到第一个字节*/
  if(s!=0x0D){
  fgets(zdm[i],11,fp);/*读字段名并赋值给数组*/
  fseek(fp,6L,1);/*找这个字段的长度*/
  zdc[i]=fgetc(fp)+1;/*将长度赋值给数组*/}}
  for(j=1,j<i;j++);/*计数器计数,以便控制*/}
  fflush(fp);/*以下显示字段及记录的内容*/
  i=1;
  {if(bbh==0x03) fseek(fp,1l,1);/*如果bbh是03,那么这个库是Foxbase数据库,指针从当前位置向后移动1位*/
  else fseek(fp,254l,1);/*如果bbh是30,那么这个库为Foxpro for Windows数据库,指针从当前位置向后移动254位*/}
  while(!feof(fp)&&(fgetc(fp)!=0x1A)){/*1A是数据库的记录结束标志,应令指针到此停止,以免显示出无用的信息来*/
  char g;
  i=1;
  printf("记录号:%d\n=====\n",l);
  while(i<j){
  fgets(jl,(int)zdc[i],fp);/*注意文件指示器的位置在本字串的下一位置*/
  printf("%-12s=%s\n",zdm[i],jl);/*字段名长度取12个字符宽,并以右空格补齐,使屏幕更加清晰*/
  i=i++;}
  printf("\n\n回车=>继续显示,ESC退出……");
  while(bioskey(1)!=0) bioskey(0);/*清除键盘缓冲区内容*/
  g=bioskey(0);/*读键盘S是int*/
  if(g==0x1b) exit(0);
  printf("\n\n");
  l=l++;}
  fclose(fp);}
  以上程序用Turbo C 2.0编译通过,在386以上机器上运行无误。