数据存储_数据文件

前言

探讨用文件存储数据的方式.这里的文件和操作系统里的文件系统有一点联系但关系不大

引入

前一篇帖子中用数据结构设计+数据库,是典型的软件架构.但不是唯一的.数据存储可以用文件的方式.数据库说到底是一种工具,再好用也是别人给的.而数据文件可以完全由自己掌控,有那么一些意义存在,心里踏实一些.

几个概念

在数据文件的实现中,笔者引入几个概念,有的是前面说过的,有的是自己增加的.

1.数据对象

数据对象是对现实事物的抽象,他是一个名词,例如:学校,年级,学生.

数据对象有其数据类型,以及基于数据类型的标识.详细内容见前面的贴

2.表

1)表的特点:只能描述字长单元长度以内的数据.表被作为数据文件中的++数据单元++.

**---**说明:CPU认识的基本数据单元是字节(位也能认识但需要操作),表作为数据单元方便分析

|-----|-----|-----|-----|-----|
|   | 属性1 | 属性2 | 属性3 | 属性4 |
| 元组1 |   |   |   |   |
| 元组2 |   |   |   |   |
| 元组3 |   |   |   |   |

同时表自带"集合"形式,一个表可以含1个或多个元组

2)表和数据对象的关系:

数据对象由1个或多个表组成.当数据对象的属性全是简单数据类型时,数据对象由1个表描述

数据对象是对数据的一种抽象描述,而表可以看作是物理描述

3.数据文件

数据文件可以由一个表或多个表所组成.表是数据单元,文件由若干数据单元组成

例如:下面的文件里放了两个表

1.dat

|------|-------|-------|-------|
|   | 面积 | 是否公立 | |
| 日出小学 | 10000 | 是 | |
| 东方小学 | 12000 | 是 | |
| 红星小学 | 9500 | 是 | |
| | | | |
| A市B区小学属性表 ||| |
| | | | |
|   | 班数 | 所处教学楼 | 有无兴趣课 |
| 1年级 | 3 | 1栋 | 无 |
| 2年级 | 3 | 1栋 | 无 |
| 3年级 | 4 | 2栋 | 无 |
| 4年级 | 3 | 2栋 | 有 |
| 5年级 | 4 | 2栋 | 有 |
| 6年级 | 5 | 3栋 | 有 |
| | | | |
| 日出小学内容表--年级属性表 ||||

他们的属性个数是不一样的.这里再引入一个概念:如果两个表的属性个数不一样,或者属性个数一样但是表达的意思不一样,则他们属于不同的表---和代码层面判断不同数据类型是类似的.

数据文件内容的访问

表可以看作是可视化的数据 .例如上面的"日出小学内容表--年级属性表",在"1年级"所在的元组,表示所有1年级的内容在这一行.包括了他对应的属性(班数,所在教学楼等)的值

之前说过:数据文件的访问=指向文件的指针+偏移.对于数据文件来说,表是数据单元.对于表来说表中的属性也是数据单元.当需要访问1年级所在班数的值时,需要指针偏移n个单位.也就是说数据文件中的数据访问是个有序的过程,先访问行再访问列 .先访问++1年级++ (指针指向他),再用对应的数据偏移量访问++1年级的班数++ .所以先让++文件指针++指向1年级,要顺次从前往后计算他的偏移量.

有了以上两个分析,怎样构建准确的数据访问呢?

1.建立一个表检索数据文件内容

表的抽象形式如下:

|----|---------|--------------|----------------|
| 序号 | 属性1(表名) | 每个表的元组个数 | 每个元组数据所占空间 |
| 1 | 表1 |   |   |
| 2 | 表2 |   |   |
| 3 |   |   |   |
| | | | |
| 映射数据文件的表 ||||

以上述1.dat为例,他的表如下:

|----|---------|----------|--------------------|
| 序号 | 属性1(表名) | 每个表的元组个数 | 每个元组数据所占空间 |
| 1 | A市B区小学表 | 3 | 9(double_8+char_1) |
| 2 | 日出小学年级表 | 6 | 3 |
| 3 |   |   |   |
| | | | |
| 映射1.dat的表 ||||

这样做的目的是把数据文件分成正确的"块",而这些数据块映射了对象.

例如想要查找日出小学一年级的数据,需要找到"日出小学年级表",用代码表示如下:

复制代码
//伪代码
File* fp=1.dat    //文件指针指向1.dat
fp+=3x9;          //文件指针偏移3x9=27,此时指向了日出小学表

说明:1.dat的设计显然是不合理的,1.dat映射表形成的文件,取个什么名好呢?暂时可以不管

2.输入+搜索算法保证准确查询

第一步的检索表解决了数据分块的问题.下面解决正确查询.

1.对输入进行约束,如下:

学校表添加序号,作为搜索条件

|----|------|
| 序号 |   |
| 1 | 日出小学 |
| 2 | 东方小学 |
| 3 | 红星小学 |

年级表添加序号(也可以不加)

|----|-----|
| 序号 |   |
| 1 | 1年级 |
| 2 | 2年级 |
| 3 | 3年级 |
| 4 | 4年级 |
| 5 | 5年级 |
| 6 | 6年级 |

2.根据序号,查找内容进行偏移

例如想查询日出小学3年级所在教学楼位置,输入2,3,2.文件指针偏移先找到"日出小学年级表",再偏移3x3=9,找到"3年级",再根据输入2,偏移2字节找到"所在教学楼"--2栋

数据文件的建立(表的填充)也是非常灵活和多样的,本贴只讲了数据部分,实际上文件的建立,要加上其他内容,例如文件戳,每个文件的头部有一些原始内容:文件建立时间,修改时间,字节大小,使用者等内容,这些都是需要空间的,根据操作系统不同有要求.

数据文件和操作系统间的交互

这部分内容和发布程序有关,笔者暂时没有相关内容,但可以作为一个思考方向

小结

数据文件可以作为数据的一种存储形式.在数据库应用如此广泛的今天,他给了程序员一些自由发挥的空间,增加一些筹码.

相关推荐
jllws112 天前
数据类设计_硬件层面的数据类表达
数据类设计
jllws11 个月前
数据类设计_单色矩阵类/图像矩阵类&引申内容_缓存机制_3D模型
数据类设计
jllws110 个月前
数据类设计_图片类设计_矩阵图类型和像素图类型设计的补充
前端·c++·矩阵·数据类设计
jllws110 个月前
数据类设计_图片类设计之8_自由图形类设计_(前端架构)
前端·c++·数据类设计
jllws11 年前
数据类设计_图片类设计之7_矩阵图形类设计更新_实战之页面简单设计(前端架构)
前端·数据类设计·c++实战
jllws11 年前
数据类设计_图片类设计之4_规则类图形混合算法(前端架构)
c++·计算机图形学·前端架构·数据类设计