第一节 认识文件
-
文件:通常计算机包含各种不同类型的文件,例如照片、音乐、
.c
文件等。文件包含程序文件
和数据文件
。将数据的输入和输出的过程称为数据流
。一个文件包含文件路径、文件标识符、文件后缀,例如D:\C_program\8\Debug\7.exe
,后缀名exe(可执行文件)、txt(文本文件)、doc(word文件)、mp4(视频文件)、mp3(音频文件)。 -
文件的分类:数据文件分为
ASCII文件
和二进制文件
,数据在内存中是以二进制
的形式进行存储的。 -
文件缓冲区:从磁盘中读取数据,会先将数据存储到输入文件缓冲区中,等文件缓冲区装满了以后发送到程序数据区;输出文件到磁盘中,会现将数据存储到输出文件缓冲区中,等文件缓冲区装满了以后再发送给磁盘。
第二节 文件的操作
-
对文件的操作方法
-
打开文件
打开文件不同于操作系统打开文件,打开文件的方法为:
fopen(文件名, 操作模式)
,fopen
为打开函数,文件名
为需要打开的文件,操作模式
为需要对文件进行何种操作。一旦文件被打开,在内存中开辟区域存放文件的有关信息(如文件的名字、文件的位置、文件的状态等)并返回此信息。定义一个FILE类型的指针变量指向被打开文件,可以将文件信息和指针变量进行关联。之后都可以对文件型指针变量进行操作,打开文件的常用方法为:FILE *fp fp = fopen(文件名, 操作模式)
-
操作模式:
- “r” :读模式,允许对文件读取信息。若文件名不正确,则报错;
- “w” :写模式,允许向文件写入信息。若文件不存在,则创建一个文件;
- “a” :追加模式,允许在文件末尾添加信息。若文件名不正确,则报错;
- “rb” “wb” “ab” 打开二进制文件,其他与以上3个相同;
- “r+” “w+” "a+"允许对文件读取和写入信息,其他与前3个相同;
- “rb+” “wb+” "ab+"允许对文件读取和写入信息,打开二进制文件,其他与前3个相同。
-
关闭文件
fclose(文件指针)
文件使用后需要关闭文件,如果没有及时关闭文件可能会导致数据丢失,关闭成功返回一个数值0,否则返回EOF(-1)
第三节 文件的读写
-
文件打开之后,根据文件的打开模式,可以进行读写。
-
向文件读取字符
fgetc(fp)
功能:从fp指向的文件获取一个字符。如果读取成功返回获取的字符,读取失败则返回文件结束标志EOF(-1)
-
向文件写入字符
fputc(c, fp)
功能:向fp指向的文件写入一个字符。如果写入成功则返回写入的字符,写入失败则返回文件结束标志EOF(-1)
-
向文件读取字符串
fgets(str, n, fp)
,功能:从fp指向的文件获取一个长度为n-1的字符串,并一次性存入到str字符数组中。如果读取成功返回str指针,读取失败则返回NULL
注意:
- 读取的
n-1
个字符,最后加上一个结束标志\0
,一共n个字符串; - 遇到换行符或文件结束标志EOF,则将之前的内容存储到str中,不再继续读取字符,表示本次读取结束(最多读取一行)。
- 读取的
-
向文件写入字符串
fputs(str, fp)
功能:将str字符数组中的内容(字符串)写入到fp指向的文件中,如果写入成功返回数字0,写入失败则返回非0的数字。
-
格式化读写内容
fprintf(文件指针, 格式字符串, 输出表列)
fscanf(文件指针, 格式字符串, 输入表列)
与printf、scanf函数相同,不同点在于不是输出到黑框的终端或者在终端输入信息,而是向文件写入信息或读取信息。
-
向文件读取一个数据块
读取数据时,数据不经过转换的读取到内存中。
fread(buffer, size, count, fp) 参数: buffer:读取的数据存入内存地址 size:读取的字节大小 count:读取数据的个数 fp:读取的文件指针 返回值:返回读取数据的个数
-
向文件写入一个数据块
写入数据时,数据不经过转换的读取到内存中。
fwrite(buffer, size, count, fp) 参数: buffer:待写入的内存地址buffer size:写入的字节大小 count:写入数据的个数 fp:写入的文件指针
-
注意:
- 由于fread、fwrite函数读写数据时不会转换数据,因此读取速度快;
- 读取二进制文件一般使用fread、fwrite函数;
- fgetc、fputc、fgets、fputs、fprintf、fscanf函数是读写字符数据,不建议用读取二进制文件。
第四节 改变文件读写位置
-
思考:
文件的读写总是从文件的开头起始,一直读写到最后,但如果文件内容较多,只需要获取某个文件指定位置的数据,这种方法就比较麻烦。不能快速获取指定位置数据。
-
文件读写指针:
文件读写标记记录访问的位置
-
rewind
函数将读写指针重新指向文件开头rewind(fp) //将fp指向的文件读写指针重新指向文件开头
-
fseek
函数指定文件读写指针位置fseek(文件指针, 位移量, 起始点) 起始点: 0 表示文件开始位置 1 表示当前读写指针位置 2 表示文件末尾位置
第五节 文件操作错误检查
读写函数是否存在错误,除了使用函数的返回值来检验以外,还可以使用错误检查读写函数是否正确执行。
-
ferror函数
ferror(fp) //返回值为0表示读写正确 //返回值为1表示读写错误
-
clearerr函数
将文件错误标志和文件结束标志置为0。当
ferror
检查到读写函数出现错误,此时应当立即调用clearerr(fp)
,使得下一轮能正常使用ferror
函数进行检查。