第23课【文件操作】文件 文件缓冲区 文件指针 文件操作函数

基本知识框架

在这里插入图片描述

课堂笔记

文件的定义

文件是某一类数据或者信息的集合体,可以是程序,文本,图片或者视频等等

文件名称

文件名称是文件的的唯一标识,它的作用是便于用户识别和引用文件

文件的名称包括:文件路径+文件名称主干+文件后缀名

例如:A:/Document/Data.txt
A:/Document/:表示文件的路径,通常是用来说明文件的位置
Data:表示文件名称主干,通常表示文件的名称
.txt:表示文件的后缀名,通常用于表示文件的类型

文件的类型

C语言程序可以进行操作的文件类型通常有两种:

  • 二进制文件:数据在计算机中是以二进制的形式存储的,如果数据不加转换直接写入文件中,那得到的就是二进制文件
  • 文本文件:如果数据在写入时经过转换,将数据转换成ASCII字符,以ASCII码的形式写入到文件中,那得到的就是文本文件

二进制文件和文本文件的区别
存储数据时,通常二进制文件会比文本文件更加节省空间,而文本文件会比二进制文件更具可读性
例如:需要存储50000这个整数

  • 使用文本文件保存时,每个数字需要一个char类型数据存储,共需要占用5个字节的空间。读取文本文件时可以直接得到50000
  • 使用二进制文件保存时,整个数转化为二进制,使用一个int类型数据存储,共需要占用4个字节的空间。读取二进制文件时可以得到00000000 00000000 11000011 01010000

文件缓冲区

文件缓冲区是内存中用于临时存放文件内容的区域。一般来说

设备名称作用
CPU处理数据
内存临时存放数据(断电易失存储器)
磁盘长期存储数据(外设存储器)
而CPU处理数据的速度 > 内存的读写速度 >> 磁盘的读写速度

那么进行文件操作时,如果直接对磁盘读写数据的话,由于磁盘读写速度很慢,整个流程执行都会变得非常的慢;但如果预先将文件从磁盘中加载到内存中临时存放,CPU处理数据时直接从内存中读写文件,内存的读写速度可比磁盘要快许多,这可以使得整个流程变得更快
在这里插入图片描述
C语言使用的磁盘系统有两大类:

  • 缓冲文件系统:在程序进行读写文件操作时,由系统自动为每一个使用到的文件开辟一块文件缓冲区(缓冲区大小由编译系统决定)。读取数据时,先将文件从磁盘中加载到内存中;写入数据时,先将数据写到文件缓冲区中,缓冲区满后再将文件保存到磁盘中
  • 非缓冲文件系统:系统不会自动为文件分配缓冲区,需要用户自己为文件分配缓冲区

传统的UNIX系统中,使用缓冲文件系统处理文本文件,使用非缓冲文件系统处理二进制文件。但1983 年ANSI C 标准决定不采用非缓冲文件系统,文件操作统一采用缓冲文件系统

文件指针

文件指针是C语言中特定的结构体类型(FILE)的指针。通过文件指针可以找缓冲区中的文件,还可以将指针指向文件特定位置,然后进行读写操作

磁盘中的文件加载到文件缓冲区时,还会开辟一块文件信息区(存储着文件信息的FILE结构体),定义文件指针后,将其指向文件信息区,即可对文件缓冲区中的文件进行读写操作

//	特定的结构体类型
typedef struct
{
	short level;
	unsigned flags;
	char fd;
	unsigned char hold;
	short bsize;
	unsigned char *buffer;
	unsigned ar *curp;
	unsigned istemp;
	short token;
}FILE;
//	定义一个文件指针
FILE* fp;

文件操作函数

文件的打开 / 关闭

fopen
FILE *fopen( const char *filename, const char *mode );

功能:打开文件,根据文件名filename,以特定文件打开模式mode打开文件
返回值:打开成功返回打开文件的文件指针,打开失败返回NULL
注意:

  • fopen打开文件实质上就是将文件加载到文件缓冲区
  • 打开文件失败返回NULL,打开文件一般需要判断是否打开成功
  • 打开模式
打开模式含义文件存在时文件不存在时
r读取从文件读取数据报错,返回NULL
w写入删除源文件,重新写入数据到文件创建文件
a附加不修改原有内容,仅在文件末尾添加数据(忽略定位操作fseek,rewind)创建文件

打开模式附加符号

  • b:如果要读写二进制文件,可以在打开模式后附加b,如rb,wb,ab
  • +:如果需要对打开模式的功能进行额外拓展,可以在打开模式后附加+,如r+,rb+,w+,wb+,a+,ab+,它可以实现拓展功能分别为:
  • r+,rb+:可读写,读写的过程中可以移动文件指针,并且读与写共用一个文件指针
  • w+,wb+:可读写,读写的过程中可以移动文件指针,仅有读操作使用文件指针,写操作会将文件指针移动到文件末尾
  • a+,ab+:可读写,读写的过程中可以移动文件指针,仅有读操作使用文件指针,写操作会将文件指针移动到文件末尾
fclose
int fclose( FILE *stream );

功能:关闭文件,关闭指针stream指向的文件
返回值:关闭成功返回0,关闭失败返回EOF
注意:

  • 关闭文件其实就是将文件缓冲区中的文件保存到磁盘。这个操作可以释放内存,如果值打开文件而不关闭文件会导致内存不足
  • 关闭文件后,需要将文件指针指向NULL,避免其成为野指针

文件的顺序读写

以下的输入输出,指的是对于文件缓冲区的输入输出

字符输入输出函数
fputc
int fputc( int c, FILE *stream );

功能:输出一个字符到文件中,将字符c输出到文件指针stream指向的位置
返回值:输出成功返回输出字符ASCII码值,输出失败返回EOF
注意:

fgetc
int fgetc( FILE *stream );

功能:从文件中输入一个字符,在文件指针stream指向的位置读取一个字符
返回值:输入成功返回输入字符ASCII码值,输入失败返回EOF
注意:

字符串输入输出函数
fputs
int fputs( const char *string, FILE *stream );

功能:输出字符串到文件中,将字符串string输出到文件指针stream指向的位置
返回值:输出成功返回非负值,输出失败返回EOF
注意:

fgets
char *fgets( char *string, int n, FILE *stream );

功能:从文件中输入字符串,从文件指针stream指向的位置读取n个字符,并存储到字符串string中
返回值:输入成功返回存储字符串string的首地址,输入失败返回NULL
注意:

  • 在读取到字符后,文件指针stream会自动指向下一个位置
  • 在读取到指定数量的字符之前,如果读取到了换行符’\n’,会停止读取,并返回字符串,返回的字符串中包括换行符’\n’
  • 如果读取到指定数量字符之前都没有读取到换行符,那么会在读取到第n-1个字符时停止读取,在已读取字符串后添加空字符,然后返回这n个字符(n-1个读取到的字符+空字符)
格式化输入输出函数
fscanf
int fscanf( FILE *stream, const char *format [, argument ]... );

功能:格式化输入文件中特定内容到程序中,以格式化的形式format将文件指针stream指向的位置输出到程序中特定数据argument
返回值:输入成功返回输入字符的个数,输入失败返回EOF
注意:

  • fscanf与scanf用法类似
  • 举例:fscanf(fp, “%d %d %s”, a, b, string);
fprintf
int fprintf( FILE *stream, const char *format [, argument ]...);

功能:格式化输出特定的数据到文件中,以格式化的形式format将程序中特定数据argument输出到文件指针stream指向的位置
返回值:输出成功返回输出字符的个数,输出失败返回负值
注意:

  • fprintf与printf用法类似
  • 举例:fprintf(fp, “%d %d %s”, 1, 2, “hello”);
数据块输入输出函数
fread
size_t fread( void *buffer, size_t size, size_t count, FILE *stream );

功能:以二进制的形式将文件中的数据输入到程序特定数据块,从文件指针stream指向的位置,以二进制的形式读取大小为size的count个数据,并保存到缓存区buffer中
返回值:输入成功则返回count,输入失败返回比count小的数
注意:

  • 文件的打开模式应该是二进制读模式,即rb
fwrite
size_t fwrite( const void *buffer, size_t size, size_t count, FILE *stream );

功能:将某个数据块以二进制形式输出到文件,将缓存区buffer中的数据,以大小为size的count个数据以二进制形式输出到文件指针stream指向的位置
返回值:输出成功则返回count,输出失败返回比count小的数
注意:

  • 文件的打开模式应该是二进制读模式,即wb

文件的随机读写

fseek
int fseek( FILE *stream, long offset, int origin );

功能:根据参照位置和偏移量来移动指针,根据参考位置origin和偏移量offset来移动文件指针stream
返回值:移动成功则返回0,移动失败返回非 0值
注意:

  • 关于参考位置
参数含义
SEEK_CUR文件指针当前的位置
SEEK_SET文件开头
SEEK_END文件结尾
ftell
long ftell( FILE *stream );

功能:计算出当前文件指针和文件开头的偏移量,根据文件指针stream计算出指针距离文件开头的偏移量
返回值:计算成功则返回偏移量,计算失败则返回-1
注意:

rewind
void rewind( FILE *stream );

功能:将文件指针移动到文件开头,将文件指针stream移动到文件开头

返回值:

注意:

文件的结束判断

EOF

EOF是End Of File的缩写,C语言标准库中将EOF宏定义为int型数据-1

当进行文件操作函数时,返回EOF,表示两种情况:

  • 读写文件时,文件指针已经指向文件末尾(需要调用函数feof()去判断)

feof
int feof(FILE* stream)
功能:判断指针是否指向文件末尾,判断指针stream是否指向文件末尾
返回值:如果指针位置未指向文件末尾,返回0,否则返回一个非0值

  • 读写文件时遇到了错误(需要调用ferror()去判断)

ferror
int ferror(FILE* stream)
功能:判断指针使用时是否发生错误,判断指针stream使用时是否发生错误
返回值:如果指针使用错误,返回0,否则返回一个非0值

基本知识框架Xmind文件下载

链接: 资源下载

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值