能自由阅读两种不同结构数据库的小工具 求知 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以上机器上运行无误。