文件是数据的集合,这个数据集的名称就是文件名。实际上在前面的各章中我们已经多次使用了文件,例如源程序文件、目标文件、可执行文件、库文件 (头文件)等。文件通常是存放在外部介质(如磁盘等)上的,在使用时才调入内存中来。从用户的角度看,Linux系统的文件分为普通文件和设备文件两种。
普通文件是指存放在磁盘或其它外部介质上的一个有序数据集,可以是源文件、目标文件、可执行程序; 也可以是一组待处理的原始数据,或者是一组输出的结果。对于源文件、目标文件、 可执行程序可以称作程序文件,对输入输出数据可称作数据文件。
设备文件是指与主机相联的各种外部设备,如显示器、打印机、键盘等。在Linux操作系统中,把外部设备也看作是一个文件来进行管理,把它们的输入、输出等同于对磁盘文件的读和写。通常把显示器定义为标准输出文件,一般情况下在屏幕上显示有关信息就是向标准输出文件输出。如前面经常使用的printf函数就是这类输出。键盘通常被指定标准的输入文件,从键盘上输入就意味着从标准输入文件上输入数据。
根据文件中数据的组织形式的不同,可以把文件分为文本文件和二进制文件。
文本文件和二进制文件
1、文本文件
数据以字符组成,把每个字符的 ASCII 码值存入文件中。每个 ASCII 码值占一个字节,每个字节表示一个字符。所以文本文件也称作字符文件或 ASCII 文件。
2、二进制文件
把数据对应的二进制数值存储到文件中,是字节序列文件。
例如数据 123,如果按文本文件形式存储,把数据看成三个字符:'1'、'2'、'3' 的集合,文件中依次存储每个字符的 ASCII 码值,格式如下表所示。
字符 |
'1' |
'2' |
'3' |
ASCII(十进制) |
49 |
50 |
51 |
ASCII(二进制) |
00110001 |
00110010 |
00110011 |
如果按照二进制文件形式存储,数据 123 被看成字符、短整型、短整型、长整型,存储方式分别如下:
字符型一个字节
01111011
短整型2个字节
00000000 01111011
整型4个字节
00000000 00000000 00000000 01111011
长整型8个字节
00000000 00000000 00000000 00000000 00000000 00000000 00000000 01111011
文本文件可以用vi和记事本打开,看到的都是ASCII字符,二进制文件用vi可以打开,但是看到的是乱码,没有意义。打开二进制文件之前,必须知道它的格式,一般来说,不同的二进制文件采用相应的软件打开它,例如图片文件用图片查看软件,音频文件用音乐播放器。
文本文件可以换行,例如我们写的C程序,就是文本文件,有换行。
二进制文件没有换行的说法,也没有字符串的说法,也没有以空字符结尾的说法,它是数据流。
打开文件和关闭
C 语言中对任何文件进行操作,都必须先“打开”文件,操作完成后,再“关闭”文件。
1、文件指针
打开文件的时候,C语言为打开的文件分配一个文件信息区,该信息区中包含文件描述信息、该文件所使用的缓冲区大小及缓冲区位置、该文件当前读写到的位置等基本信息。这些信息保存在一个结构体类型变量中(struct _IO_FILE),这个结构体有一个别名FILE(typedef struct _IO_FILE FILE),FILE结构体和对文件操作的库函数在 stdio.h 头文件中声明的。