1.什么是文件
文件有不同的类型,在程序设计中,主要用到两种文件:
1. 程序文件:包括源程序文件(后缀为 .c),目标文件(后缀为 .o)以及可执行文件等。这种文件里的内容是程序代码。
2. 数据文件:文件的内容不是程序,而是供程序运行时读写的数据,包括在程序运行过程中输出到磁盘的数据和在程序运行过程中供读入的数据,如全班学生的成绩数据、货物交易的数据等。
我们主要讨论的是数据文件,为了简化用户对输入输出设备的理解,用户不必区分各种输入输出设备之间的区别,操作系统把各种设备都统一作为文件来处理。例如终端键盘是输入文件,显示屏和打印机是输出文件。
2.文件的分类
根据数据的组织形式,数据文件可分为ASCLL文件和二进制文件。数据在内存中都是以二进制形式存储的,如果不加转换的输出到外存,就是二进制文件,可以认为就是内存的映像,称为映像文件。如果要求在外存中以ASCLL码形式存储,则需要在存储前进行转换。ASCLL文件又称为文本文件,每一个字节存放一个字符的ASCLL码。
用ASCLL码形式输出时字节与字符一一对应,一个字节代表一个字符,因而便于对字符进行逐个处理,也便于输出字符。但一般占存储空间较多,而且要花费转换时间。用二进制形式输出数值,可以节约外存空间和转换时间,把内存中的存储单元中的内容原封不动的输出到外存磁盘上,此时一个字节并不一定代表一个字符。
3.打开和关闭文件
对文件读写之前应该“打开”该文件,使用结束之后“关闭”文件。实际上,所谓的打开文件是指为文件建立相应的信息区(用来存放有关文件的信息)和文件缓冲区(用来暂时存放输入输出的数据)。
1. fopen函数打开数据文件
fopen 函数的调用方式为 fopen(文件名,使用文件的方式);。
fopen 函数的返回值是指向文件的指针(即文件信息区的起始地址)。通常将 fopen 函数的返回值赋给一个指向文件的指针变量。
2. fclose函数关闭数据文件
在使用完一个文件后应该关闭它,以防止它被误用。“关闭”就是撤销文件信息区和文件缓冲区,使文件指针变量不再指向该文件。 fclose 函数的调用方式:fclose(文件指针);。
4.文件的输入与输出
文件打开之后,就可以对它进行读写了。在顺序写时,先写入的数据存放在文件中前面的位置,后写入的数据存放在文件中后面的位置。在顺序读时,读数据的顺序和数据在文件中的物理顺序是一致的。顺序读写需要用库函数实现。
对文本文件读入或输出一个字符的函数见表:
随机读写顺序文件
对文件进行顺序读写比较容易理解,也容易操作,但是效率不高。比如文件中存放了一个城市几百万人的资料,我们想要查找某一个人,按照顺序读写需要从第一个数据逐个读入,等待的时间是不能忍受的。 为了解决这个问题,可移动文件内部的位置指针到需要读写的位置,再进行读写,这种读写被称为随机读写。随机访问不是按数据在文件中的物理位置次序进行读写,而是可以对任何位置上的数据进行访问,显然这种方法比顺序访问的效率高得多。
实现随机读写的关键是要按要求移动位置指针,也就是文件的定位。
移动文件内部的位置指针的函数主要有两个,即 rewind() 和 fseek()。
rewind 函数的调用形式为:rewind(文件指针);,它的功能是把文件内部的位置指针移到文件开头。
下面主要介绍 fseek 函数。fseek 函数用来移动文件内部的位置指针,其调用形式为:fseek(文件指针,位移量,起始点); 。 其中:“文件指针”指向被移动的文件;“位移量”表示移动的字节数,要求位移量是 long 型数据,以便在文件长度大于 64KB 时不会出错,当用常量表示位移量时,要求加后缀“ L ”;“起始点”表示从何处开始计算位移量,规定的起始点有三种:文件首,当前位置和文件尾。
其表示方法如下表:
如:
fseek(fp, 100L, 0);
其意义是把位置指针移到离文件首 100 个字节处。
还要说明的是 fseek 函数一般用于二进制文件。在文本文件中由于要进行转换,故往往计算的位置会出现错误。