文件和文件指针的操作

2.5k 词

文件指针

文件指针就是用于标识一个文件的,程序中所有对文件的操作都需要通过文件指针执行。

文件指针的一般形式

FILE* 指针变量标识符;

FILE为大写,需要引用<stdio.h>

FILE是系统使用typedef定义出来的有关文件信息的一种结构体类型,结构中含有文件名、文件状态和文件当前位置等信息

一般情况下,我们操作文件前必须定义一个文件指针标示我们将要操作的文件

实际编程中使用库函数操作文件,无需关心FILE结构体的细节,只需要将文件指针传给io库函数,库函数再通过FILE结构体里的信息对文件进行操作。

FILE 结构体的定义:

1
2
3
4
5
6
7
8
9
10
11
12
13
typedef struct
{
short level; //缓冲区“满”或“空”的程度
unsigned flags; //文件状态标志
char fd; //文件描述符
unsigned char hold; //如无缓冲区不读取字符
short bsize; //缓冲区的大小
unsigned char *buffer; //数据缓冲区的位置
unsigned ar; //文件位置指示器
unsigned char *curp; //文件位置指示器
unsigned istemp; //临时文件指示器
short token; //用于有效性检查
} FILE;

对文件操作的步骤:

  1. 对文件进行读写等操作之前要打开文件得到文件指针
  2. 可以通过文件指针对文件进行读写等操作
  3. 读写等操作完毕后,要关闭文件,关闭文件后,就不能再通过此文件指针操作文件了

文件指针位置操作函数

ftell

获取文件指针的位置

1
long ftell(FILE *stream);

ftell函数返回stream标识的文件指针的位置。

返回值:

  • 成功:返回文件指针的位置
  • 失败:返回-1

参数:

  • stream:要获取的文件指针

fseek

设置文件指针的位置

1
2
3
4
int fseek(
FILE *stream,
long offset,
int whence);

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
2
3
FILE *fopen(
const char *filename,
const char *mode);

文件指针的初始化:

1
2
3
4
5
6
7
FILE *fp = NULL;
fp = fopen("test.txt", "r");
if (fp == NULL)
{
printf("文件打开失败\n");
return 0;
}

返回值:

  • 成功:返回文件指针
  • 失败:返回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:要刷新的文件指针