4.6.1 编程中如何解决数据的保存问题
在编写大型软件时,系统中经常涉及大量数据,例如学籍管理系统方面的学生学籍情况 就是一个很大的数据集合,该数据集合一旦建立后就需要保留,以后每次运行学籍管理系统,
都可以对此数据集合进行增、减、改等操作,而不必每次都重新建立。那么采用什么办法来保 存系统中大量数据呢?在 C 语言中最常采用的方法是利用文件类型,将数据以文件的形式保 存在磁盘里,这样就可以达到长期保存数据的目的。由于可以对文件进行读出、写入、修改、
增加和删除等操作,因而也就可以实现对数据库进行插、删、改等操作。
在系统运行中使用的大批数据,主要通过两种数据结构来暂存,一种是数组结构,另一 种是链表结构。
下面以数字类型为例,进一步说明利用文件类型长期保存数据的方法。需要建立一个数 据文件。
例 4-25 从键盘输入一组数据,然后把它们保存在数据文件 in4.dat 中。程序如下:
# include<conio.h>
# include<stdio.h>
# include<string.h>
main() { FILE * rt;
int x, i cirscr();
if ((rf = fopen("in4.dat","r"= =NULL) { printf("Cannot open file\n");
return;
}
for(i = 0 ; i<10 ; i ++) { fscanf(rf, "%d", &x);
printf("%d",x);
} fclose(rt);
}
上面的例子比较简单,这里需要着重强调一点:查看保存在 in4.dat 文件中的数据的方法。
在 Turbo C 环境下,选择 File→Open 命令,只需要将文件名及扩展名 dat 完整输入进去,即可 在编辑窗口显示文件内容。
4.6.2 数据库的发展
虽然可以用 C 语言开发一个简单的数据库管理软件,但是它与专业化的数据库管理系统 无论在规模上还是在复杂性上都有天壤之别,不过用 C 语言开发简单的数据库管理软件对全 面了解和运用 C 语言的知识却是大有益处的。为了更好地解决如何用 C 语言编制数据库的问 题,本节有必要对数据库的发展有个大概的了解。
我们说数据管理指的就是对数据的组织、编目、存储、检索和维护。随着计算机技术的 发展,数据管理也经历了由低级向高级的发展过程。
人工管理阶段(20 世纪 50 年代中期以前)。
文件管理阶段(20 世纪年代后期至 60 年代后期)。
数据库系统阶段(20 世纪 70 年代初以后)。
早期的数据管理就是人工处理,即通过人工对数据进行组织、编目、存储、检索和维护,
这一切都需要人对处理数据的物理结构了解清楚,这个阶段耗时费力,工作量非常大。
到了文件管理阶段,由于可以通过文件系统与设备介质来管理和保存信息,并把信息的 逻辑结构映像成设备介质上的物理结构。这样就可以使用户不必过多地考虑物理细节,而将精 力集中于算法上。
文件系统中的文件基本上是对应于一个或几个应用程序,或者说数据是面向应用的。它 仍然是一个不具有弹性的无结构信息集合,因此也就存在以下几个方面的问题:
(1)冗余度大。
文件系统下的用户各自建立自己的文件,相互之间数据不能共享,造成数据大量重复存储。
不仅浪费存储空间,更严重的是容易造成数据的不一致性。
(2)数据独立性差。
数据和程序相互之间的依赖仍较严重。
(3)数据无集中管理。
各个文件没有统一的管理机构,其安全性和完整性等无法得到保证。
所有这些问题,文件系统本身都无法解决,这严重地阻碍了数据处理技术的进展,同时,
也成为数据库技术产生的原动力和背景。于是数据库系统便应运而生,并在 20 世纪 60 年代末 期诞生了第一个商品化的数据库系统——美国 IBM 公司的 IMS(Information Management System)系统。
数据库系统的目标首先就是克服文件系统的这些弊病,用一个软件来集中管理所有的文 件,以实现数据的共享,保证数据的完整性、安全性。
4.6.3 数据库系统的特点
与文件系统比较,数据库系统有以下特点:
(1)数据的结构化。
在文件系统中,各个文件不存在相互联系。从单个文件来看,数据一般是有结构的;但 是从整个系统来说,数据在整体上又是没有结构的。数据库系统则不同,在同一数据库中的数 据文件是有联系的,且在整体上服从一定的结构形式。
(2)数据共享。
共享是数据库系统的目的,也是它的重要特点。一个库中的数据不仅可为同一企业或机 构之内的各个部门所共享,也可为不同单位、地域甚至不同国家的用户所共享。而在文件系统 中,数据一般是由特定用户专用的。
(3)数据的独立性。
在文件系统中,数据结构和应用程序相互依赖,一方的改变总是要影响另一方的改变。
数据库系统则力求减小这种相互依赖,实现数据的独立性。虽然目前还未能完全做到这一点,
但较之文件系统已大有改善。
(4)可控冗余度。
数据专用时,每个用户拥有并使用自己的数据,难免有许多数据相互重复,这就是冗余。
实现共享后,不必要的重复将全部消除,但为了提高查询效率,有时也保留少量重复数据,其 冗余度可由设计人员控制。
表 4-17 以对照表的的形式,列出了数据库系统与一般文件应用系统的主要性能差别。由 此可以看出,用 C 语言编写的数据库管理软件就属于文件管理阶段。
表 4-17 数据库系统与一般文件应用系统性能对照表
序号 文件应用系统 数据库系统
1 文件中的数据由特定的用户专用 库内数据由多个用户共享
2 每个用户拥有自己的数据,导致数据重
复存储
原则上可消除重复,为方便查询允许少量数据重复 存储
3 数据从属于程序,二者相互依赖 数据独立于程序,强调数据的独立性
4 各数据文件彼此独立,从整体看为“无
结构” 各文件的数据相互联系,从总体看是“有结构”
4.6.4 数据库基本概念
数据库技术是一门综合性技术,它涉及操作系统、数据结构、算法设计、程序设计等基 础理论知识;它是计算机科学中一项专门的学科。它的基本知识主要有数据库、数据库系统、
数据库管理系统、数据模型等方面的基本概念。
但是这里谈的基本概念只是与文件应用系统有关的数据库的最底层概念。
数据:通常使用各种各样的物理符号来表示客观事物的特性和特征,这些符号及组合就 是数据。数据的概念包括两个方面:数据内容和数据形式。
数据内容:是指所描述客观事物的具体特性,即数据的“值”。
数据形式:是指数据内容存储在媒体上的具体形式,即数据的“类型”。数据主要有数字、
文字、声音、图形和图像等多种形式。
实体:客观事物在信息世界中称为实体,它是现实世界中任何可区分、可识别的事物。
实体可以是具体的人或物,如张三同学、石景山业余大学;也可以是抽象概念,如一个人、一 所学校。
属性:实体的特性称为属性。一个实体可用若干属性来刻画。每个属性都有特定的取值 范围,即值域。值域的类型可以是整数型、实数型、字符型等。
实体型:实体型就是实体的结构描述,通常是实体名和属性名的集合;具有相同属性的 实体,有相同的实体型。实体值是一个具体的实体,是属性值的集合。如学生实体型是:学生
(学号,姓名,性别,年龄);学生李建国的实体值是:(011110,李建国,男,19)。
属性值:就是属性在其值域中所取的具体值。如“李建国”是学生实体中的姓名的属 性值。
关系:在数据库理论中,关系是指由行与列构成的二维表。在关系模型中,实体和实体 间的联系都是用关系表示的。也就是说,二维表格中既存放着实体本身的数据,又存放着实体 间的联系。
关系模型:是建立在关系代数基础上的,具有坚实的理论基础。与层次模型和网状模型
相比,具有数据结构单一、理论严密、使用方便、易学易用的特点。目前,绝大多数数据库系 统的数据模型均采用关系模型。
4.6.5 文件存储 4.6.5.1 文件概念
对于数据库来说,一般还要求把单表中的数据存储在外部介质(比如硬盘)上。这就要 求对文件存储类的函数功能也要有个详细的了解。
所谓“文件”是指一组相关数据的有序集合。这个数据集有一个名称,叫做文件名。实 际上在前面的各章中已经多次使用了文件,如源程序文件、目标文件、可执行文件、库文件(头 文件)等。文件通常是驻留在外部介质(如磁盘等)上的,在使用时才调入内存中。从不同的 角度可对文件作不同的分类。从用户的角度看,文件可分为普通文件和设备文件两种。
普通文件是指驻留在磁盘或其他外部介质上的一个有序数据集合,可以是源文件、目标 文件、可执行程序;也可以是一组待输入处理的原始数据,或者是一组输出的结果。对于源文 件、目标文件、可执行程序可以称为程序文件,对输入/输出数据可称为数据文件。
设备文件是指与主机相连的各种外部设备,如显示器、打印机、键盘等。在操作系统中,
把外部设备也看作是一个文件来进行管理,把它们的输入、输出等同于对磁盘文件的读和写。
通常把显示器定义为标准输出文件。如前面经常使用的 printf、putchar 函数就是这类输出。键 盘通常被指定标准的输入文件,从键盘上输入就意味着从标准输入文件上输入数据。scanf、
getchar 函数就属于这类输入。
从文件编码的方式来看,文件可分为 ASCII 码文件和十进制码文件两种。
ASCII 文件也称为文本文件,这种文件在磁盘中存放时每个字符对应一个字节,用于存放 对应的 ASCII 码。例如,数 5678 的存储形式如表 4-18 所示。
ASCII 文件也称为文本文件,这种文件在磁盘中存放时每个字符对应一个字节,用于存放 对应的 ASCII 码。例如,数 5678 的存储形式如表 4-18 所示。