模拟foxbase命令-c语言
主要功能 模拟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; /*数据定位*/
读入数据,去除空格,转换成数字,最后比较。
相关新闻>>
- 发表评论
-
- 最新评论 更多>>