文件的随机读写
介绍完文件的顺序读写,它是按照规定的顺序一个一个往下读的,之前读的数据无法再次读取,而有些时候,我们又需要原来的数据完成一些事情,需要返回去读取原来的数据,这时候就需要文件的随机读写
fseek函数
fseek函数可以根据文件指针的位置和偏移量来定位文件指针,就是移动指针,将指针移动到你想要读取的数据的位置。
语法格式:int fseek(FILE*stream,long offset,int origin)
- 参数1是文件指针,指向被操作的文件
- 参数2是偏移量,表示对文件指针的移动,正数表示正向移动,负数表示反向移动
- 参数3是指定文件从哪里开始偏移,主要有三个取值:SEEK_CUR(文件开头,取值为0),SEEK_CUR(当前位置,取值为1),SEEK_END(文件结尾,取值为2)
具体实例
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
FILE* pa = fopen("佳乐.txt", "w");//以写的形式打开文件,如果文件不存在,就创造一个文件
if (pa == NULL)
{
perror("fopen");//显示错误信息
return 1;
}
//使用
fputs("hauciya", pa);
//使用完需要关闭文件,同时置空指针
fclose(pa);
pa = NULL;
FILE* PA = fopen("佳乐.txt", "r");//在此打开文件,打开方式为“r”,代表只读,文件在第一次
//打开时已经被创建好了,用一个新的FILE*类型的指针接收
if (PA == NULL)
{
perror("fopen");
return 2;
}
fseek(PA, 4, 0);//移动文件指针,参数2为4,代表移动4,从h开始偏移,最后指向i
int a = 0;
a = fgetc(PA);
printf("%c\n", a);
fclose(PA);
PA = NULL;
return 0;
}
一开始的PA文件指针指向的是h,经过fseek函数操作之后,PA指针向后偏移四个位置,到达i的位置,这时候对文件进行读取操作,就是从i开始读取
运行结果
fseek函数大大提高了文件操作的灵活性,可以指哪打哪。但过于灵活也会带来弊端,多次执行fseek函数操作后,你会发现,你不知道文件指针指向哪里,下一次读取的数据从哪里开始,就会出现问题。
这时候可以使用ftell函数
ftell函数
ftell函数就是用来显示当前文件指针相对于起始位置的偏移量的,有了他,我们就可以在多次操作之后,仍清楚的知道此刻文件指针指向哪里。
语法格式:int ftell(FLIE*stream)
- 参数是文件指针
- 返回类型是int类型,返回的值就是此刻文件指针相对于起始位置的偏移量
rewind函数
rewind函数的功能相当于重启,它可以使文件指针回到初始位置,重置一切,我们有时候想回到过去,在c中,用rewind函数就可以完成。
语法格式: void rewind(FILE*stream);
- 参数为文件指针
- 无返回值,仅仅是重置一切