来源:C语言文件操做彻底攻略 (biancheng.net)数据库
数据的输入和输出几乎伴随着每一个 C 语言程序,所谓输入就是从“源端”获取数据,所谓输出能够理解为向“终端”写入数据。这里的源端能够是键盘、鼠标、硬盘、光盘、扫描仪等输入设备,终端能够是显示器、硬盘、打印机等输出设备。在 C 语言中,把这些输入和输出设备也看做“文件”工具
计算机上的各类资源都是由操做系统管理和控制的,操做系统中的文件系统,是专门负责将外部存储设备中的信息组织方式进行统一管理规划,以便为程序访问数据提供统一的方式。
文件是操做系统管理数据的基本单位,文件通常是指存储在外部存储介质上的有名字的一系列相关数据的有序集合。它是程序对数据进行读写操做的基本对象。在 C 语言中,把输入和输出设备都看做文件。
文件通常包括三要素:文件路径、文件名、后缀。大数据
文件名:标识文件名字的合法标识符,如 ch十、file_1 等都是合法的文件名。spa
后缀:通常用于标明文件的类型,使用方式为:文件名.后缀,即文件名与后缀之间用 '.' 隔开。常见的后缀类型有:doc、txt、dat、c、cpp、obj、exe、bmp、jpg 等。操作系统
流是逻辑的抽象的.net
I/O 设备的多样性及复杂性,给程序设计者访问这些设备带来了很大的难度和不便。为此,ANSIC 的 I/O 系统即标准 I/O 系统,把任意输入的源端或任意输出的终端,都抽象转换成了概念上的“标准 I/O 设备”或称“标准逻辑设备”。程序绕过具体设备,直接与该“标准逻辑设备”进行交互,这样就为程序设计者提供了一个不依赖于任何具体 I/O 设备的统一操做接口,一般把抽象出来的“标准逻辑设备”或“标准文件”称做“流”。设计
把任意 I/O 设备,转换成逻辑意义上的“标准 I/O 设备”或“标准文件”的过程,并不须要程序设计者感知和处理,是由标准 I/O 系统自动转换完成的。故从这个意义上,能够认为任意输入的源端和任意输出的终端均对应一个“流”。对象
文件按其逻辑结构可分为:记录文件和流式文件。而记录文件又可分为:顺序文件、索引文件、索引顺序文件及散列文件等。索引
流式文件是以字节为单位,对流式文件的访问通常采用穷举搜索的方式,效率不高,故通常需频繁访问的较大数据不适宜采用流式文件逻辑结构。但因为流式文件管理简单,用户能够较方便地对文件进行相关操做。接口
流按方向分为:输入流和输出流。从文件获取数据的流称为输入流,向文件输出数据称为输出流。
流按数据形式分为:文本流和二进制流。文本流是 ASCII 码字符序列,而二进制流是字节序列。
对于计算机来讲,一切皆数据,能存放数据的方式有不少种,如内存,文件,数据库等,文件是极其重要的一种。
1. 文本数据和二进制数据
1. 1 文本数据
把要存储的数据当成一系列字符组成,把每一个字符的 ASCII 码值存入文件中。每一个 ASCII 码值占一个字节,每一个字节表示一个字符。故文本文件也称做字符文件或 ASCII 文件,是字符序列文件(文本数据,能用文本工具打开看懂得文字)
1.2 二进制数据
把数据对应的二进制形式存储到文件中,是字节序列文件(二进制数据,文本工具打开,不能识别的文字,显示乱码)
字符 | '1' | '2' | '3' |
---|---|---|---|
ASCII(十进制) | 49 | 50 | 51 |
ASCII(二进制) | 0011 0001 | 0011 0010 | 0011 0011 |
2.缓冲和非缓冲文件系统
C语言中文件系统可分为两大类,一种是缓冲文件系统也称为标准文件系统,另外一种是非缓冲文件系统。ANSI C 标准中只采用缓冲文件系统。
2.1 缓冲文件系统
缓冲文件系统:系统自动为每一个打开的文件在内存开辟一块缓冲区,缓冲区的大小通常由系统决定。当程序向文件中输出(写入)数据时,程序先把数据输出到缓冲区,待缓冲区满或数据输出完成后,再把数据从缓冲区输出到文件;当程序从文件输入(读取)数据时,先把数据输入到缓冲区,待缓冲区满或数据输入完成后,再把数据从缓冲区逐个输入到程序。
2.2 非缓冲文件系统
非缓冲文件系统:系统不自动为打开的文件开辟内存缓冲区,由程序设计者自行设置缓冲区及大小。
程序每一次访问磁盘等外存文件都须要移动磁头来定位磁头扇区,若是程序频繁地访问磁盘文件,会缩短磁盘的寿命,何况速度较慢,与快速的计算机内存处理速度不匹配。
带缓冲区文件系统的好处是减小对磁盘等外存文件的操做次数,先把数据读取(写入)到缓冲区中,至关于把缓冲区中的数据一次性与内存交互,提髙了访问速度和设备利用率。
通常把带缓冲文件系统的输入输出称做标准输入输出(标准 I/O),而非缓冲文件系统的输入输出称为系统输入输出(系统 I/O)。
ANSI C 为正在使用的每一个文件分配一个文件信息区,该信息区中包含文件描述信息、 该文件所使用的缓冲区大小及缓冲区位置、该文件当前读写到的位置等基本信息。这些信息保存在一个结构体类型变量中,该结构体类型为 FILE 在 stdio.h 头文件中定义,不容许用户改变。每一个 C 编译系统 stdio.h 文件中的 FILE 定义可能会稍有差异,但均包含文件读写的基本信息。