C语言中的文件操作
在我们介绍文件操作之前需要理解的知识点包括:文件类型、数据流、缓冲区、文件存取方式
磁盘上的文件是文件,但在程序设计中,我们谈到的文件分为程序文件和数据文件
- 程序文件:
包括源程序文件(后缀为.c),目标文件(Windows环境后缀为.obj),可执行文件(Windows环境后缀为.exe)
- 数据文件:
文件内容不一定是程序,而是程序运行时读写的数据。
-
文件类型
数据在内存中以二进制形式进行存储,如果不加转换输出到外存,就是二进制文件。
如果在外存中需要以ASCII码 的形式存储,则在存储前进行转换。以ASCII码字符形式存储的文件就是文本文件。文本文件是以字符编码的方式进行保存的,如果以记事本打开,会看到一堆乱码。
其实,除了文本文件外,所有的数据都可以算是二进制文件。二进制文件的优点在于存取速度快,占用空间小,以及可随机存取数据。
例如:整数10000,如果以ASCII码形式输出到磁盘,数值型数据可以以ASCII或者二进制形式存储。
如果以ASCII形式存储,需要五个字节(每个字节一个字符),而二进制形式只需要四个字节(int)
指程序与数据的交互是以流的形式进行的。进行C语言文件的存取时,都会先进行“打开文件”操作,这个操作就是在打开数据流,而“关闭文件”操作就是关闭数据流。
ANSIC标准采用“缓冲文件系统”处理数据文件,所谓缓冲文件系统是系统自动的在内存中为程序中每一个正在使用的文件开辟一小块“文件缓冲区”。
事实上,当写入文件时,并不会马上写入磁盘中,而是先写入缓冲区,只有在缓冲区已满或“关闭文件”时,才会将数据写入磁盘,如下图所示。
每个被使用的文件都在内存中开辟了相应文件信息区,用来存放文件相关信息(文件名称,文件状态,文件当前位置等)。这些变量都保存在一个结构体变量中。该结构体类型由系统声明:FILE。
我们平时对文件进行操作时,都是通过文件指针FILE *来维护FILE结构变量。
我们可以创建FILE *指针变量:
FILE *pf; //文件指针变量
文件读写包括顺序读写方式和随机读写方式两种。
顺序读写也就是从上往下,顺序读取文件的内容。保存数据时,将数据附加在文件的末尾。这种存取方式常用于文本文件,而被存取的文件则称为顺序文件。
随机读写方式多以二进制文件为主。它会以一个完整的单位来进行数据的读取和写入,通常以结构为单位。
2.1 文件的打开与关闭
文件在读写之前先打开文件,使用结束之后关闭文件。
打开文件函数原型:
FILE *fopen( const char *filename, const char *mode);
filename是文件名,mode是打开方式。打开成功返回FILE *的文件结构指针,打开失败,返回NULL。
使用fopen()函数打开的文件会先将文件复制到缓冲区。注意:所进行的读取或写入动作,都是针对缓冲区进行存取而不是磁盘,只有当使用fclose()函数关闭文件时,缓冲区中的数据才会写入磁盘。
谈文件打开模式:
“r”(只读):为了输入数据,打开一个已经存在的文本文件,该文件必须先存在,否则打开失败
“w(只写)”:为了输出数据,打开一个文本文件,若指定的文件不存在则创建它,如果存在则会被输入内容覆盖
“a(追加)”:向文件增加新数据(不删除原有数据),若文件不存在则打开失败,打开时位置指针移到文件末尾
“r+(读写)”:为了读和写,打开一个文本文件,该文件必须先存在,否则打开失败
“w+(读写)”:为了读和写,新建一个文本文件,先向该文件写数据,然后可读取该文件中的数据
“a+(读写)”:可读/写数据,打开一个文件,在文件尾进行读写,原来的文件不被删去,位置指针移到文件末尾
打开二进制文件的模式与打开文本文件的含义是一样的,区别是模式名称里面多一个字母’b’,以表示以二进制形式打开文件。
2