本节我们学习了文件相关的知识,文件分为两种,一种是程序文件,一种是数据文件,本节我们主要学习的是数据文件。
为了我们识别和引用,文件设有文件名,文件名由三部分组成,分别是文件路径,文件名主干,文件后缀。
数据文件分为文本文件和二进制文件,文本文件是以ASCII码值存储的文件,而二进制文件是以二进制的形式存储的文件。
字符一律是用ASCII码值存储,而数值既可以用ASCII码值存储也可以用二进制形式存储。
为了方便操作,我们抽象出了一个流的概念,我们对数据的输入输出操作都是通过流来操作的。我们想从流里面写如数据或者读取数据,都要先打开流,然后再操作。
当我们运行c语言程序的时候,默认打开了三个标准流,stdin-标准输入流,stdout标准输出流,stderr-标准错误流。而这三个流的类型是FILE*,我们称为文件指针。
C语言中我们就是通过文件指针来维护文件的各种操作。
struct _iobuf { char *_ptr; int _cnt; char *_base; int _flag; int _file; int _charbuf; int _bufsiz; char *_tmpfname; }; typedef struct _iobuf FILE;这是一种文件指针的声明,不同的编译器声明大同小异。
ANSIC规定使⽤ fopen 函数来打开⽂件, fclose 来关闭⽂件。
文件使用方式 含义 如果指定⽂件不存在
“r”(只读) 为了输⼊数据,打开⼀个已经存在的⽂本⽂件 出错
“w”(只写 为了输出数据,打开⼀个⽂本⽂件 建⽴⼀个新的⽂件
“a”(追加)向⽂本⽂件尾添加数据 建⽴⼀个新的⽂件
“rb”(只读)为了输⼊数据,打开⼀个⼆进制⽂件 出错
“wb”(只写)为了输出数据,打开⼀个⼆进制⽂件 建⽴⼀个新的⽂件
“ab”(追加)向⼀个⼆进制⽂件尾添加数据 建⽴⼀个新的⽂件
“r+”(读写)为了读和写,打开⼀个⽂本⽂件 出错
“w+”(读写)为了读和写,建议⼀个新的⽂件 建⽴⼀个新的⽂件
“a+”(读写)打开⼀个⽂件,在⽂件尾进⾏读写 建⽴⼀个新的⽂件
“rb+”(读写)为了读和写打开⼀个⼆进制⽂件 出错
“wb+”(读 写) 为了读和写,新建⼀个新的⼆进制⽂件 建⽴⼀个新的⽂件
“ab+”(读 写) 打开⼀个⼆进制⽂件,在⽂件尾进⾏读和写 建⽴⼀个新的⽂件
输入输出分别有一下函数fgetc,fputc,fgets,fputs,fscanf,fprintf,fread,fwrite
文件的随机读写我们可以借助这些函数,fseek根据⽂件指针的位置和偏移量来定位⽂件指针。
ftell返回⽂件指针相对于起始位置的偏移量。
rewind让⽂件指针的位置回到⽂件的起始位置。
对于文件结束的判定
不能⽤feof函数的返回值直接来判断⽂件的是否结束。 feof 的作⽤是:当⽂件读取结束的时候,判断是读取结束的原因是否是:遇到⽂件尾结束。 1. ⽂本⽂件读取是否结束,判断返回值是否为EOF(fgetc)或者NULL(fgets)。
2. ⼆进制⽂件的读取结束判断,判断返回值是否⼩于实际要读的个数。
ANSIC标准采⽤“缓冲⽂件系统”处理的数据⽂件的,所谓缓冲⽂件系统是指系统⾃动地在内存中为 程序中每⼀个正在使⽤的⽂件开辟⼀块“⽂件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓 冲区,装满缓冲区后才⼀起送到磁盘上。如果从磁盘向计算机读⼊数据,则从磁盘⽂件中读取数据输 ⼊到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。缓 冲区的⼤⼩根据C编译系统决定的。
因为有缓冲区的存在,C语⾔在操作⽂件的时候,需要做刷新缓冲区或者在⽂件操作结束的时候关闭⽂ 件。 如果不做,可能导致读写⽂件的问题。