Description
键盘输入一个数字以打开相应的数据库文件(1---aaa.dic,2---bbb.dic,3---ccc.dic), 再输入一个学生的名字,从文件中读出该同学的math成绩,若查无其人,则输出No。

有关数据库文件头的结构,请参看3591题目中的描述。文件头之后,是数据部分,数据部分的结构如下:

下面是文件头结构的数据表(3591):

说明:已知数据库文件中肯定有name和math两个字段

名字中有可能有空格,如:zhang san

分数位数不够,左边会有空格,如: 7.5

有些记录已被逻辑删除

Input
输入1或者2或者3,再输入一个学生的名字

Output
用printf("%.3f\n",...)这种格式输出分数(保留3位小数)或No

Sample Input
1
lisi
Sample Output
80.000
Code 1 here:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct{char biaozhi;char shijian[3];int zongshu;short long1;short long2;//每条记录的长度char empty[20];
}HEAD;
typedef struct{char name[10];char empty_c;char leixing;int weizhi;char long3;char weishu;char empty[14];    }FIELD;
int main()
{FILE *fp;int i,a,b,j;float score;char name[11]="0",s[11]="0",name1[11]="0",c;HEAD head;FIELD field[2];scanf("%d\n",&b);//注意要取走一个换行符,或者不写'\n',在下一行添getchar();gets(name1);//学生姓名if(b==1){if((fp=fopen("aaa.dic","rb"))==NULL)exit(1);}if(b==2){if((fp=fopen("bbb.dic","rb"))==NULL)exit(1);}if(b==3){if((fp=fopen("ccc.dic","rb"))==NULL)exit(1);}fread(&head,32,1,fp);a=(head.long1-32-1)/32;//字段长度for(i=1;i<=a;i++)//找name的位置{fread(&field[0],32,1,fp);if(strcmp(field[0].name,"name")==0){break;}}fseek(fp,32,0);for(i=1;i<=a;i++)//找math的位置{fread(&field[1],32,1,fp);if(strcmp(field[1].name,"math")==0){break;}}for(j=0;j<head.zongshu;j++)//跳记录,怎么结束呢,上面结构体有信息了{strcpy(name,"\0");fseek(fp,head.long1,0);//跳整个文件头fseek(fp,head.long2*j,1);//跳记录fseek(fp,field[0].weizhi,1);//跳到name的位置fread(&name,field[0].long3,1,fp);for(i=field[0].long3-1;i>=0;i--)//是空格时添0,注意数组是要-1的{if(name[i]==32||name[i]=='\0')name[i]='\0';else break;}  if(strcmp(name,name1)==0)//如果名字一样,输出他的数学成绩{fseek(fp,head.long1,0);//跳文件头fseek(fp,head.long2*j,1);//跳记录fread(&c,1,1,fp);//看是否逻辑删除if(c==42){printf("No");break;}fseek(fp,field[1].weizhi-1,1);//跳到math的位置,往上一个fread(&s,field[1].long3,1,fp);//读score=(float)atof(s);printf("%.3f",score);break;}}if(j>=head.zongshu)printf("No");fclose(fp);return 0;}

关于下面的题目,是直接读取了跳过文件头的第一条记录(也可以叫第0条记录),上面的代码是在如下代码的基础上改进的,如下:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct{char biaozhi;char shijian[3];int zongshu;short long1;short long2;char empty[20];
}HEAD;
typedef struct{char name[10];char empty_c;char leixing;int weizhi;char long3;char weishu;char empty[14];}FIELD;
int main()
{FILE *fp;int i,a,b;float score;char name[11]="0",s[11]="0";//一定初始化HEAD head;FIELD field;scanf("%d",&b);if(b==1){if((fp=fopen("aaa.dic","r"))==NULL)exit(1);}if(b==2){if((fp=fopen("bbb.dic","r"))==NULL)exit(1);}fread(&head,32,1,fp);a=(head.long1-32-1)/32;for(i=1;i<=a;i++){fread(&field,32,1,fp);if(strcmp(field.name,"name")==0){break;}}fseek(fp,head.long1+field.weizhi,0);fread(&name,field.long3,1,fp);for(i=field.long3-1;name[i]==32||name[i]==0;i--)//name里中间可能有空格,需要保留,后面也可能有空格,是不需要保留的,所以从后往前读,遇到空格或'\0'都换成'\0',对于'\0'理解不是很深刻,没有机会尝试是否AC,但上一题使用的方法是可以的{name[i]='\0';}for(i=0;name[i]!='\0';i++)printf("%c",name[i]);printf("\n"); fseek(fp,32,0);for(i=1;i<=a;i++){fread(&field,32,1,fp);if(strcmp(field.name,"math")==0){break;}}fseek(fp,head.long1+field.weizhi,0);fread(s,field.long3,1,fp);//得到的是字符分数,需要转换成实型分数,在这里使用atof()函数实现此功能功能,或者编程序实现。函数自动换成浮点数score=(float)atof(s);printf("%.3f",score);fclose(fp);return 0;
}

23.3.15 文件实训2 数据库文件读取相关推荐

  1. SEEK学习论坛-JavaWeb开发实训课题 (数据库MySQL+js+Ajax+Servlet)

    关于这次学校实训,我们做了一个类似于CSDN博客的项目,然后我们小组取名叫SEEK,一个学习论坛,前面ppt有介绍,我主要是负责后端数据库的,与MySQL交互,由我的组长写好js代码,然后将前端所获取 ...

  2. 头歌-信息安全技术-实训04 数据库SQL注入漏洞

    头歌-信息安全技术-实训04 数据库SQL注入漏洞 第一关:获取dvwa环境 任务描述 实验步骤 1. 安装appach 2.安装php 3.修改apache配置文件 4.安装mysql 5.安装dv ...

  3. 实训三:文件系统命令及vi编辑

    实训三:文件系统命令及vi编辑 2017年11 月 1 日 今日公布 vim 编辑又三种模型:一般模式.命令模式.编辑模式 [练习1]Linux文件系统管理命令 分别用下列命令创建两个用户: user ...

  4. 快速附加没有日志文件的 SQL Server 数据库文件!

    快速附加没有日志文件的 SQL Server 数据库文件: 1 CREATE DATABASE [数据库名称] 2 ON (FILENAME = '数据库文件路径和文件名(如:D:\db\mydb.m ...

  5. 如何更改服务器上的数据库文件夹,如何设置数据库文件位置

    如何设置数据库文件位置 08/07/2014 本文内容 适用于: Exchange Server 2007 SP3, Exchange Server 2007 SP2, Exchange Server ...

  6. 复用Oracle数据文件,Oracle 多元复用数据库文件

    为尽量降低丢失控制文件或重做日志文件的可能性,数据库文件的多元复用(multiplexing)可减少或消除由于介质故障而造成的数据丢失问题.使用从Oracle 10g 开始引入的ASM 实例可在某种程 ...

  7. Android开发系列(十七):读取assets文件夹下的数据库文件

    在做Android应用的时候,不可避免要用到数据库.可是当我们把应用的apk部署到真机上的时候,已经创建好的数据库及其里边的数据是不能随着apk一起安装到真机上的. (PS:这篇博客攻克了我前面博客中 ...

  8. sql文件怎么导入数据库mysql_sql文件怎么用 导入数据库文件

    展开全部 其实导入的方法很简单,可32313133353236313431303231363533e78988e69d8331333365633836以采用工具导入和只用mysql命令界面导入两种方式 ...

  9. 暑假实训-3_Oracle数据库-3_单行函数

    -- 2018/07/11 13:30-16:30 实训第2天下午SELECT * FROM emp;-- 单行函数-- 字符函数 -- 2-1 查询员工姓名中包含大写或小写字母A的员工姓名 SELE ...

  10. 计算机基础与应用23页思考与实训,《计算机基础与应用》实训作业三

    <计算机基础与应用>实训作业(三) 实训练习一.数据库技术基础综合应用 [实训要求] 1.能够建立和维护Access数据库 2.能够使用SQL中的四条基本语句:INSERT.UPDATE. ...

最新文章

  1. Ubuntu下跑通py-faster-rcnn、详解demo运作流程
  2. perl 操作 timesten 数据库 带用户名和密码验证
  3. 组件 -- Alert
  4. Java ArrayList到数组
  5. ubuntu安装linux deepin,Ubuntu 13.04安装Linux Deepin特色软件
  6. JAVA设计模式之工厂模式(简单,工厂,抽象)
  7. 把路由器配置成DHCP服务器,并确保路由功能。
  8. SQL——连接字符串常用函数
  9. docker port is already allocated 的解决方案
  10. java: 不兼容的类型: java.lang.Long无法转换为java.lang.Intege
  11. 手机控制树莓派驱动投影仪DLPDLCR230NPEVM
  12. arch linux u盘安装,如何把ArchLinux安装到U盘上
  13. 电商后台设计:系统消息
  14. C++ 实现去除文本中的重复行
  15. 『已解决』0/1 nodes are available: 1 node(s) had taints that the pod didn‘t tolerate.
  16. stm32实现毫秒ms微秒us级延时
  17. c语言看门狗指令pic,PIC指令介绍
  18. LTE下行物理层传输机制(4)-CCE
  19. Predict Binding Sites of Transcription Factor 富集分析
  20. 人脸检测:《MTCNN》论文详解2016

热门文章

  1. ROS Smach-----状态创建和添加
  2. Android-MVP模式详解,附超全教程文档
  3. 考研英语从零基础到入门day4
  4. php 索引数组添加字段,PHP编程技能:以指定字段为索引返回数组数据
  5. 4.1 数据类型和变量
  6. c# 尝试读取或写入受保护的内存异常处理
  7. 【Spring系列】:SpringIOC知识点(供参考)
  8. NeurIPS 2022《Weakly-Supervised Multi-Granularity Map Learningfor Vision-and-Language Navigation》阅读笔记
  9. ORACLE SOA SUITE 11G 应用日志报错:faultString: BEA-380000: General runtime error: Broken pipe
  10. 消息队列之六脉神剑:RabbitMQ、Kafka、ActiveMQ 、Redis、 ZeroMQ、Apache Pulsar对比和如何使用