您现在的位置:计算机技术学习网 > 技术中心 > 编程开发 > C >

模拟foxbase命令-c语言

来源:不详 责任编辑:栏目编辑 发表时间:2013-07-02 06:03 点击:

主要功能 模拟Foxbase的use,list,list stru,count,count for命令,用链表实现,有个地方指针用错了,还有个地方有个潜在的危险,都不想改了,就这样吧,哈哈。

一. 软件介绍
1.软件名称:模拟FoxBase+系统
2. 软件功能:
  模拟FoxBase+系统的use、count、count for、list、list stru命令,读取DBF文件,对文件进行操作,显示内容及结构,并计算满足逻辑表达式的元组的个数。
3.软件使用说明:
1) 使用FoxBase+ 系统建立数据库文件。
2) 运行模拟FoxBase+系统。
3) 使用use filename打开文件
a) 使用list<回车>显示文件内容
b) 使用list stru<回车>显示文件结构
c) 使用close关闭已打开的文件
d) 使用count显示数据库记录个数
e) 使用count for <表达式>计算满足逻辑表达式的元组的个数
f) 使用quit退出程序
4. 软件运行环境:
 MS-DOS,Win98,Win2000,WinXP系统
5.编译环境
 Turbo C2.0
6. 软盘文件说明
 
二. 软件设计思想
1. 程序流程图

 

 

2.设计思想
1) 程序的命令接收:
通过使用while(1)循环建立程序主循环,主循环中使用gets()函数得到用户输入的命令字符串,然后将字符串通过空格分解成num个参数存入parameter指针数组.并作为Engine()函数的参数。Engine()通过比较parameter[0]和command[i].command中的字符串(如果相同)则跳到command[j].pfn所指向的函数。
COM结构的定义是:
typedef struct tag_command{                     /*命令映射结构*/
 char command[10];    /*命令字符串*/
 int (*pfn)(int num,char *str[]); /*命令处理函数指针*/
}COM,*pCOM;
2) 文件读取:
  首先建立两个结构
 typedef struct fild_head{   /*dbf文件描述结构*/
 char tag;
 char data[3];
 long int num;
 int  headlength;
 int  reclength;
 char temp[20];
}FILEHEAD;

typedef struct data_field{   /*字段结构*/
 char fieldname[11];
 char fieldtag;
 int  pos;
int  fieldpos;
 char fieldlength;
 char dec;
        char temp[14];
}FIELD;
首先通过fread()读取文件描述存入全局结构变量fhead。读取字段描述时由于字段个数不确定,因此使用链表。链表的建立在初始化中完成,然后通过循环
while(1)       /*读字段数据,加入链表*/
{
 fread(&field,sizeof(FIELD),1,fp);
 if(field.fieldname[0]==0x0d){break;}
 Add(head,&field);
}


 每当fread()读入数据后使用Add()函数将field加到链表尾。
显示数据在dis_rec()函数中完成,遍历链表输出字段名,后再次遍历链表通过字段结构中的字段长度项的数值,读入相应长度的数据存入data
for(i=0;i{
printf("%7d   ",i+1);
fread(&tag,sizeof(char),1,fp);
printf("%c",tag);
for(h=head->next;h!=NULL;h=h->next)
{
   memset(data,NULL,20);
   fread(data,1,(h->field).fieldlength,fp);
   strcpy(data,del_char(data,' '));  /*去除空格*/
   printf(“%s”,data);
}
printf(“\n”);
 }
 
  显示结构dis_stru()中完成,遍历链表中结点,显示每个节点的结构内容。
 3)数据的对齐
通过比较字段名长度,和字段长度,选出其中最大值作为显示字段的长度,这样既可以对齐数据又
可以使显示跟加紧凑,以便在一行中显示更多能容。
4)count和count for命令处理
count for命令的首要问题是得到符号(>,<,=)两边的参数,由于前面通过空格将用户输入的字符串分成num个参数,当输入命令 如:”count for field >80”等则得不到正确的参数。因此使用link_par()函数将count for后的参数连接成新的字符串,在通过Analyse(str,par,'>');从>(或<,=)处将字符串分开,形成两个参数。
当参数同文件数据比较时由于数据库文件中的数据有可能存在空格,并且使用字符串比较容易出现错误如:”100”同”80”比较,因此使用atol()将字符串转换成数字(用户输入的参数也已转换成数字)。
比较的过程是FindNote()找到要比较的节点,读出字段数据位置并计算
pos=fhead.headlength+fhead.reclength*i+(h->field).pos; /*数据定位*/
读入数据,去除空格,转换成数字,最后比较。
    发表评论
    请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
    用户名: 验证码:点击我更换图片
    最新评论 更多>>
    网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
    Copyright © 2008-2015 计算机技术学习交流网. 版权所有

    豫ICP备11007008号-1