能自由阅读两种不同结构数据库的小工具
如果要对两种不同版本的数据库进行查寻,总免不了要在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以上机器上运行无误。