文件指针
文件指针就是用于标识一个文件的,程序中所有对文件的操作都需要通过文件指针执行。
文件指针的一般形式
FILE* 指针变量标识符;
FILE为大写,需要引用<stdio.h>
FILE是系统使用typedef定义出来的有关文件信息的一种结构体类型,结构中含有文件名、文件状态和文件当前位置等信息
一般情况下,我们操作文件前必须定义一个文件指针标示我们将要操作的文件
实际编程中使用库函数操作文件,无需关心FILE结构体的细节,只需要将文件指针传给io库函数,库函数再通过FILE结构体里的信息对文件进行操作。
FILE 结构体的定义:
1 | typedef struct |
对文件操作的步骤:
- 对文件进行读写等操作之前要打开文件得到文件指针
- 可以通过文件指针对文件进行读写等操作
- 读写等操作完毕后,要关闭文件,关闭文件后,就不能再通过此文件指针操作文件了
文件指针位置操作函数
ftell
获取文件指针的位置
1 | long ftell(FILE *stream); |
ftell函数返回stream标识的文件指针的位置。
返回值:
- 成功:返回文件指针的位置
- 失败:返回-1
参数:
- stream:要获取的文件指针
fseek
设置文件指针的位置
1 | int fseek( |
fseek函数将stream标识的文件指针移动到whence指定的位置,移动的偏移量为offset。
返回值:
成功:返回0
失败:返回非0
参数:
- stream:要设置的文件指针
- offset:要移动的偏移量
offset的取值- 大于0:向文件末尾移动
- 小于0:向文件开头移动
- 等于0:不移动
- whence:要移动的位置
whence的取值:- SEEK_SET(0):从文件开头开始移动
- SEEK_CUR(1):从文件当前位置开始移动
- SEEK_END(2):从文件末尾开始移动
移动文件指针的结束条件:
- 移动到文件的末尾
- 移动到文件的
size-1个字符 - 移动到文件结束符EOF
rewind
将文件指针重置到文件开头
1 | void rewind(FILE *stream); |
rewind函数将stream标识的文件指针重置到文件开头。
返回值:
- 无
参数:
- stream:要重置的文件指针
文件操作函数
fopen
打开文件并得到文件指针
1 | FILE *fopen( |
文件指针的初始化:
1 | FILE *fp = NULL; |
返回值:
- 成功:返回文件指针
- 失败:返回NULL
参数:
- filename:要打开的文件路径
- mode:打开文件的方式
文件打开路径(filename):
- 绝对路径:从盘符开始的路径
C:/test/abc.txt - 相对路径:从当前路径开始的路径
./abc.txt
文件打开方式(mode):
| 模式 | 说明 |
|---|---|
| r | 只读,文件必须存在 |
| w | 只写,文件不存在则创建,存在则清空 |
| a | 只写,文件不存在则创建,存在则追加 |
| r+ | 读写,文件必须存在 |
| w+ | 读写,文件不存在则创建,存在则清空 |
| a+ | 读写,文件不存在则创建,存在则追加 |
文件打开模式(mode)的补充:
+的意义:
- 可以同时进行读写操作
- 文件指针在打开文件时默认指向文件开头,
r+和w+会清空文件;a+不会清空文件,文件指针在打开文件时默认指向文件末尾。
fclose
关闭文件
1 | int fclose(FILE *fp); |
返回值:
- 成功:返回0
- 失败:返回EOF
参数:
- fp:要关闭的文件指针
关闭文件的意义:
- 关闭文件后,文件指针将不再指向该文件,不能通过该文件指针对文件进行操作
- 关闭文件后,文件缓冲区中的数据会写入文件,文件指针指向文件末尾
- 关闭文件后,文件缓冲区会被释放,文件指针指向NULL
关闭文件的方式:
- 使用
fclose函数关闭文件 - 程序结束时,操作系统会自动关闭所有打开的文件
- 程序结束时,如果文件没有被关闭,操作系统会自动关闭文件,但会输出警告信息
关闭文件的意义:
- 关闭文件后,文件指针将不再指向该文件,不能通过该文件指针对文件进行操作
- 关闭文件后,文件缓冲区中的数据会写入文件,文件指针指向文件末尾
- 关闭文件后,文件缓冲区会被释放,文件指针指向NULL
feof
判断文件指针是否到达文件末尾
1 | int feof(FILE *stream); |
feof函数判断stream标识的文件指针是否到达文件末尾。
返回值:
- 到达文件末尾:返回非0
- 未到达文件末尾:返回0
参数:
- stream:要判断的文件指针
ferror
判断文件操作是否出错
1 | int ferror(FILE *stream); |
ferror函数判断stream标识的文件操作是否出错。
返回值:
出错:返回非0
未出错:返回0
参数:
- stream:要判断的文件指针
clearerr
清除文件指针的错误标志
1 | void clearerr(FILE *stream); |
clearerr函数清除stream标识的文件指针的错误标志。
返回值:
- 无
参数:
- stream:要清除的文件指针
fflush
刷新文件缓冲区
1 | int fflush(FILE *stream); |
fflush函数刷新stream标识的文件缓冲区。
返回值:
成功:返回0
失败:返回EOF
参数:
- stream:要刷新的文件指针