/*FoxBASE+模拟系统源代码文件:Foxsys.c*/
#include "stdio.h"
#include "conio.h"
#include "stdlib.h"
#include "alloc.h"
#include "math.h"
#include "Foxsys.h" /* "Foxsys.h" 是本模拟系统的数据结构头文件*/
void use(FILE *), liststruct( ), list(FILE *), countfor(FILE *, char *); /*函数说明*/
int check( );
/**************************************************/
/*主函数main():完成对命令的识别和相应子函数的调用*/
/**************************************************/
void main()
{ char temp[81], *command, *phrase; /*命令行和子句最大长度为80*/
int ptr, prompt=0; /* prompt: 错误命令标志*/
FILE *filepointer=NULL; /*将文件指针初始化为空*/
clrscr(); /*调用clrscr()函数完成清屏*/
printf("\n\n FoxBASE+ 模拟系统\n\n");
/*完成对命令的识别和相应子函数的调用*/
for( ; 1; ) /*恒为真, 直到输入"quit"退出*/
{ if(prompt) /*当prompt为真时, 提示出错*/
printf("\n 不识别的命令动词,按任一键继续...\n\n");
command=phrase=temp; /*command和phrase复位*/
printf(" . ");
gets(command); /*从键盘接收命令*/
/*1.截取命令行的命令动词和子句。*/
for( ; *command==' '; command++) ; /*舍弃命令动词的前导空格 */
if(strlen(command)==0) /*直接回车或仅由空格构成*/
{ prompt=0; /*置错误标志为"假"*/
continue; /*回到循环头*/
}
/* 设置命令动词结束位置(ptr) */
for(ptr=0; (*(command+ptr)!='\0')&&(*(command+ptr)!=' '); ptr++) ;
/* 判断命令是否带有子句 */
if(*(command+ptr)==' ') /*命令动词结束, 可能带有子句*/
{ *(command+ptr)='\0'; /*在命令动词后置结束标志*/
/*处理子句*/
for(ptr++; *(command+ptr)!='\0'&&*(command+ptr)==' '; ptr++) ;
if(*(command+ptr)!='\0') /*存在子句*/
{ phrase=command+ptr; /*phrase指向子句首字符*/
ptr=strlen(phrase) - 1; /*子句尾字符位置*/
for(; *(phrase+ptr)==' '; ptr--) ;
*(phrase+ptr+1)='\0'; /*舍弃尾部空格*/
}
/*不存在子句时, phrase=temp ! */
}
/* 2. 命令识别和相应子函数调用*/
if(strcmp(strlwr(command),"quit")==0) /*退出命令*/
{ if( filepointer != NULL ) /*已打开一个数据库文件*/
{ free(ftp); /*释放由use()函数申请的内存块*/
fclose(filepointer);
}
system("cls");
break; /*退出循环, 结束运行*/
}
if(strcmp(strlwr(command),"clear")==0) /*清屏命令*/
{ clrscr();
prompt=0;
continue;
}
if(strcmp(strlwr(command),"use")==0) /*打开数据库文件命令*/
{ if(phrase==temp) /*缺数据库文件名*/
{ printf("\n 请输入数据库文件名: ");
gets(phrase);
printf("\n");
}
/*处理文件的扩展名*/
if(strchr(phrase, '.')==NULL) /*未带扩展名*/
strcat(phrase,".dbf"); /*默认为.dbf*/
if((filepointer=fopen(phrase,"rb")) == NULL)
{ printf("\n 文件不存在或打不开,按任一键继续... ");
getch(); /*等待按任意键(不回显)*/
printf("\n\n");
}
else /*打开成功, 处理文件名*/
{ if(DBF.filename!=NULL) /*非空(表示已经打开一个文件)则先释放*/
free(DBF.filename);
DBF.filename=(char *)malloc(strlen(phrase)+1);
strcpy(DBF.filename, phrase); /*复制文件名*/
use( filepointer ); /*调用use()函数*/
}
prompt=0;
continue;
}
if(strcmp(strlwr(command),"list")==0) /*显示命令*/
{ if(check()==1) /*已打开一个数据库文件*/
if( strcmp(phrase,"stru") == 0 ) /*显示结构*/
liststruct( );
else
if(phrase==temp) /*无stru子句, 显示记录*/
list(filepointer);
else
{ printf("\n 非法短语: %s,按任一键继续...", phrase);
getch();
printf("\n\n");
}
prompt=0;
continue;
}
if(strcmp(strlwr(command),"countfor")==0) /*统计命令*/
{ if(check()==1) /*已打开一个数据库文件*/
{ if(phrase==temp) /*无统计条件, 提示输入*/
{ printf("\n 请输入统计条件表达式: ");
gets(phrase);
}
countfor(filepointer, phrase); /*调用统计函数*/
}
prompt=0;
continue;
}
prompt=1; /*置命令错误标志*/
}
} /*主函数main()结束*/
/***************************/
/*check()函数:合法性检查 */
/* 形参:无。 */
/*返回值:1--合法,0--非法 */
/***************************/
int check()
{ int value=1; /*预置返回值为“真”*/
if(ftp==NULL) /*未打开数据库文件*/
{ printf("\n 必须首先打开数据库文件,按任一键继续...");
getch();
printf("\n\n");
value=0; /*置非法标志*/
}
return(value);
} /* check()函数结束*/
/***************************************************************************/
/* use()函数: 打开数据库文件,即将文件说明内容读出、并存储到结构变量DBF中,*/
/* 同时,将字段说明内容读出、并存储到结构变量指针ftp中。 */
/* 形 参:FILE * */
/* 返回值:无 */
/***************************************************************************/
void use( FILE *fp )
{ unsigned int loop, offset;
/*读取文件的前12字节: 标志1B,日期3B,记录数4B,结构长度2B,记录长度2B*/
fread( &DBF, 12, 1, fp);
/*检查是否是数据库文件*/
if( DBF.tag!=3 && DBF.tag!=131 ) /*非数据库文件*/
{ printf("\n not a database file, press any key to continue...");
getch();
printf("\n\n");
return; /*返回*/
}
DBF.FieldCount=(DBF.FileStructSize-33)/32; /*计算字段数*/
ftp=(struct FIELD *)malloc(sizeof(struct FIELD)*DBF.FieldCount);
for(loop=1; loop <= DBF.FieldCount; loop++)
{ offset=(long)loop*32;
fseek(fp, offset, 0); /*移动到字段说明的开始位置*/
fgets(ftp->name, 11, fp); /*读字段名*/
fseek(fp, offset+11, 0); /*移动到字段类型数据位置*/
ftp->type=fgetc(fp);
ftp->offset=getw(fp); /*读字段在记录中的起始位置*/
fseek(fp, offset+16, 0); /*移动到字段长度数据位置*/
ftp->width=fgetc(fp);
ftp->decimal=fgetc(fp);
ftp++; /*指针下移一个元素*/
}
ftp = ftp - DBF.FieldCount; /*ftp复位*/
} /* use()函数结束 */
/************************************************/
/* liststruct()函数:分屏显示当前数据库文件结构 */
/* 形参:无 */
/* 返回值:无 */
/************************************************/
void liststruct( )
{ int loop=1;
printf("Structure for database: %s\n",DBF.filename);
printf("Number of data records: %ld\n",DBF.RecordCount);
printf("Date of last update: ");
printf("%2d.%2d.%2d\n",DBF.date[0],DBF.date[1],DBF.date[2]);
/*打印表头*/
printf("FieldNo Fieldname Type Width Decimal\n");
/*输出所有字段的名称、类型、宽度和小数位数*/
for(; loop <= DBF.FieldCount; loop++, ftp++)
{ printf("%7d %-10s %-4c ",loop,ftp->name,ftp->type);
printf("%-5d %-d\n",ftp->width,ftp->decimal);
if(loop%20==0) /*每显示20个字段, 暂停*/
{ printf(" Press any key to continue... ");
getch();
}
}
printf("** Total ** %d\n\n",DBF.RecordSize);
ftp = ftp - DBF.FieldCount; /*ftp复位*/
} /*liststruct()函数结束 */
/***********************************************/
/* list()函
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
经典C语言ppt教案附源代码(强烈推荐) (105个子文件)
FOXSYS.C 13KB
CASE5_8.C 3KB
case4_8.C 3KB
CASE6_6.C 2KB
CASE10_7.C 2KB
case75_1.C 2KB
al7_8.c 1KB
case6_4.C 1KB
case10_8.C 1KB
CASE9_13.C 1KB
CASE12_4.C 1KB
CASE6_3.C 1KB
CASE9_4.C 1KB
CASE9_14.C 1KB
case9_11.C 1KB
case12_3.C 1KB
case9_3.C 1KB
case4_5.c 1KB
CASE7_3.C 1KB
CASE6_5.C 973B
case10_6.C 959B
case6_2.C 922B
case7_6.C 905B
case3_11.C 856B
CASE6_1.C 847B
CASE10_5.C 817B
case10_3.C 808B
case4_4.c 789B
case4_7.c 786B
case1_2.C 784B
CASE11_2.C 729B
CASE5_7.C 726B
case9_1.C 724B
case10_1.C 719B
case9_10.C 703B
case9_2.C 686B
case7_2.C 681B
case9_6.C 654B
case4_6.C 640B
case10_4.C 598B
case12_1.C 587B
al7_7.c 583B
case9_71.C 567B
case9_12.C 564B
case8_1.C 558B
case12_2.C 548B
CASE7_7.C 541B
case9_5.C 532B
case4_1.c 531B
case9_72.C 528B
case10_2.C 521B
case3_10.C 518B
case7_1.C 517B
al7_10.c 516B
CASE5_6.C 506B
CASE7_4.C 486B
case2_3.C 481B
case3_2.C 443B
case4_2.c 422B
case2_4.C 420B
case3_8.C 417B
case5_3.C 415B
al7_9.c 414B
case11_1.C 396B
case75_4.C 395B
CASE75_6.C 392B
case75_3.C 391B
case75_5.C 388B
case75_2.C 388B
al7_12.c 382B
al7_13.c 379B
case3_1.C 370B
CASE5_5.C 367B
case3_7.C 364B
case5_2.C 347B
CASE5_4.C 346B
case3_9.C 339B
case2_2.C 325B
case3_3.C 288B
case9_8.C 281B
case5_1.c 279B
case9_9.C 274B
case3_6.C 268B
case2_1.C 246B
case1_1.C 240B
case3_5.C 236B
case4_3.c 231B
case3_4.C 196B
Foxsys.DBF 1KB
电子教案使用说明.doc 21KB
Foxsys.h 818B
STRUCT.H 719B
第04章-选择结构程序设计.ppt 519KB
第09章-指针(1).ppt 364KB
第05章-循环结构程序设计.ppt 360KB
第07章-函数与变量作用域.ppt 326KB
第12章-文件.ppt 286KB
第02章-数据类型.ppt 239KB
第06章-数组.ppt 237KB
第03章-顺序结构程序设计.ppt 210KB
共 105 条
- 1
- 2
资源评论
xkyny
- 粉丝: 6
- 资源: 54
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 三维装箱问题(Three-Dimensional Bin Packing Problem,3D-BPP)是一个经典的组合优化问题
- 以下是一些关于Linux线程同步的基本概念和方法.txt
- 以下是一个简化的示例,它使用pygame库来模拟烟花动画的框架.txt
- Linux线程同步机制深度解析与实用指南.zip
- PTA题库C语言解题策略与实战.rar
- SVPWM控制技术的simulink建模与仿真【包括simulink模型,参考文献,操作步骤】
- AI高清修复图片画质易语言易语言源码易语言填表
- 映射窗口.ec易语言易语言模块CPU占用0%游戏监控窗口监控
- 易语言 361窗口模块高效、便捷、自封装、自用
- 易语言 窗口排列 模块 ,简单、高效、体积小
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功