论坛: 编程破解 标题: 请问如何用c语言编程模拟foxbase环境 复制本贴地址    
作者: xiaoquqi [xiaoquqi]    论坛用户   登录
请问如何用c语言编程模拟foxbase环境

要求实现对dbf访问,并且实现list\list stru\use\count for\quit的最简单功能。

谢谢!


[此贴被 286(unique) 在 08月27日13时49分 编辑过]

地主 发表时间: 08/27 11:40

回复: 286 [unique]   版主   登录
你的问题归结于一点,就是知道DBF文件的结构.然后这些问题就迎刃而解.
我以前曾作过一个读DBF文件的C程序。改日我找找,看能不能找到。


B1层 发表时间: 08/27 12:46

回复: acheron [acheron]   论坛用户   登录
286,DBF结构(转)
dbf file structure
~~~~~~~~~~~~~~~~~~

bytes description
00    foxbase+, foxpro, dbaseiii+, dbaseiv, no memo - 0x03
foxbase+, dbaseiii+ with memo - 0x83
    foxpro with memo - 0xf5
    dbaseiv with memo - 0x8b
    dbaseiv with sql table - 0x8e

01-03 last update, format yyyymmdd **correction: it is yymmdd**
04-07    number of records in file (32-bit number)
08-09    number of bytes in header (16-bit number)
10-11    number of bytes in record (16-bit number)
12-13    reserved, fill with 0x00
14    dbaseiv flag, incomplete transaction
begin transaction sets it to 0x01
    end transaction or rollback reset it to 0x00

15 encryption flag, encrypted 0x01 else 0x00
changing the flag does not encrypt or decrypt the records

16-27 dbaseiv multi-user environment use
28    production index exists - 0x01 else 0x00
29    dbaseiv language driver id
30-31 reserved fill with 0x00
32-n    field descriptor array
n+1    header record terminator - 0x0d

field descriptor array table
bytes description
0-10 field name ascii padded with 0x00
11    field type identifier (see table)
12-15    displacement of field in record
16    field length in bytes
17    field decimal places
18-19    reserved
20    dbaseiv work area id
21-30    reserved
31     field is part of production index - 0x01 else 0x00

field identifier table
ascii description
c character
d date, format yyyymmdd
f floating point
g general - foxpro addition
l logical, t:t,f:f,y:y,n:n,?-not initialized
m memo (stored as 10 digits representing the dbt block number)
n numeric
p picture - foxpro addition

note all dbf field records begin with a deleted flag field.
if record is deleted - 0x2a (asterisk) else 0x20 (space)
end of file is marked with 0x1a

不知道有没有用处


B2层 发表时间: 08/27 12:57

回复: 286 [unique]   版主   登录
thanx for 黄泉。周未回家找找吧,找到再说。

B3层 发表时间: 08/28 09:22

回复: 286 [unique]   版主   登录
                        给数据库中的数据加表格
    Foxbase给人们数据处理带来了许多方便。但美中不足的是在打印时,数据都是直接打印出来。看上去很单调,也很不美观。如果在数据之间加一些表格线,自然会带来更好的效果,同时也更符合人们的习惯。笔者在实践中,编写了一个能自动给数据库加表格的程序,希望能给你带来一些方便。
    此程序生成可执行文件之后,不需进入Foxbase系统,只要在DOS下运行即可,在DOS下共有四种运行该文件的方法:
    C:\FOX>Foxtool                                     :显示帮助信息
    C:\FOX>Foxtool <数据库文件名.dbf>                  :只显示,不打印
    C:\FOX>Foxtool <数据库文件名.dbf> <生成文件名.txt> :保存到文件
    C:\FOX>Foxtool <数据库文件名.dbf> prn              :直接打印
   其中第三条所生成的带表格的数据库还可以在任何编辑软件中进行二次利用。

#include <stdio.h>
#define FIELDMAX    20
#define TRUE         1
#define FALSE        0
#define RECLONGMAX 500       /*记录最长范围*/

struct DeclareSystem{
char Flag;
char Date[3];
unsigned long RecordNumber;
unsigned StructLongth;
unsigned RecordLongth;
char UnUse[20];
     }Sys;
struct DeclareWord{
unsigned char WordName[11];
char WordType;
char UnUse1[4];
char WordLong;
char Decimal;
char UnUse2[2];
char WorkArea;
char Unuse3[11];
  }Word[FIELDMAX];
FILE *fpr,*fpw;
unsigned int FieldNumber;
unsigned char Record[RECLONGMAX];
int Delete=FALSE;
void ReadSystem();
void Display();
void Row(int Number,char *First,char *Middle,char *Last);
void List();

int main(int argc,char *argv[])
{
printf("\n\t\t\t\t数据库显示、转化程序(版本:2・0)\n\t\t版权所有:Unique 1997 所有权力保留!\n");
        if (argc==1) {printf("\n\n\t用法:\n\t\tFoxtool <数据库文件名.dbf>                  :模拟显示");
                                  printf("\n\t\tFoxtool <数据库文件名.dbf> <生成文件名.txt> :保存到文件");
                                  printf("\n\t\tFoxtool <数据库文件名.dbf> prn              :直接打印");
     exit(1);}
if (argc==2) fpw=fopen("con","w");else if ((fpw=fopen(argv[2],"w"))==NULL) {printf("\n\n\t无法生成文件或打印机未接好");exit(1);}
if ((fpr=fopen(argv[1],"rb"))==NULL) {printf("\n\n\t不能找到或打开数据库文件: %s",argv[1]);exit(1);}
ReadSystem();
Display();
fcloseall();
printf("\n\t\t\t★☆★谢谢使用★☆★\n");
}
void List()
{
unsigned long Rec;
if (Sys.RecordLongth>RECLONGMAX) printf("记录长度太长,只能取前500个字符位!");
for (Rec=0;Rec<Sys.RecordNumber;Rec++)
{
Row(4,"\n┠","┼","┨");
fread(Record,Sys.RecordLongth,1,fpr);
Row(2,"\n┃","│","┃");
}
}
void Row(int Number,char *First,char *Middle,char *Last)
{
int TempLength,TempDec;
int i,j,k,Pos=1;
char Oven;
if (Record[Pos]=='*') return;
fprintf(fpw,First);
for (i=0;i<FieldNumber;i++)
{
TempLength=11;
for(j=11;j>0;j--) if ((char)Word[i].WordName[j]=='\0') TempLength--;
TempDec=TempLength-Word[i].WordLong;
if (TempDec<0) TempLength=Word[i].WordLong;
if (TempLength%2==1) {TempLength++;Oven=TRUE;} else Oven=FALSE;
for (j=0;j<TempLength;j++)
switch(Number)
{
 case 0:fprintf(fpw,"━");j++;break;
 case 1:if (Oven==TRUE && j==TempLength-1) fprintf(fpw," "); else fprintf(fpw,"%c",Word[i].WordName[j]=='\0'?0x20:Word[i].WordName[j]);break;
 case 2:if (Oven==TRUE && j==TempLength-1) fprintf(fpw," "); else if (TempDec>0) {fprintf(fpw," ");TempDec--;}else fprintf(fpw,"%c",Record[++Pos]);break;
 case 4:fprintf(fpw,"─");j++;break;
}
if (Oven==TRUE) Pos--;
if (i<FieldNumber-1) fprintf(fpw,Middle);
}
fprintf(fpw,Last);
}
void Display()
{
Row(0,"\n┏","┯","┓");
Row(1,"\n┃","│","┃");
List();
Row(0,"\n┗","┷","┛");
}
void ReadSystem()
{
fread(&Sys,32,1,fpr);
FieldNumber=(Sys.StructLongth-32-1)/32;
fread(Word,32,FieldNumber,fpr);
}
    此程序在TC2.0上运行通过。适合于DbaseⅡ、Ⅲ、Ⅳ以及Foxbase所生成的数据库文件。


B4层 发表时间: 08/29 21:28

回复: allyesno [allyesno]   论坛用户   登录
现在还有人foxbase吗????我还记得玩过上面一个拼写英文的游戏

自己还做过一个查询系统。。。(现在早就忘了怎么做了。。。)

B5层 发表时间: 08/30 02:35

回复: xiaoquqi [xiaoquqi]   论坛用户   登录
那当然做程序需要的


B6层 发表时间: 08/30 13:35

回复: 286 [unique]   版主   登录
有一个老人在海边漫步时,看到一个年轻人不停地把搁浅到海滩的鱼扔到远方海中。他就问年轻人:“海滩这么大,鱼这么多,你能都救得活吗?”,年轻人笑了笑,指着手中的那条鱼说:“至少这一条可以!”

B7层 发表时间: 08/30 15:49

论坛: 编程破解

20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon

粤ICP备05087286号