C语言rewind和fseek函数的用法详解(随机读写文件)
前面所讲到的文件读写函数都是顺序读写,即读写文件只能从头开始,依次读写各个数据。
但在实际开发中经常需要读写文件的中间部分,要解决这个问题,就得先移动文件内部的位置指针,再进行读写。
这种读写方式称为随机读写,也就是说从文件的任意位置开始读写。
实现"随机读写"的 关键 是要"按要求移动位置指针",这称为"文件的定位"。
一、文件定位函数"rewind()函数"和"fseek()函数"
移动"文件内部位置指针"的函数主要有两个
即 rewind() 和 fseek()。
rewind()函数 用来将 "位置指针" 移动到 "文件开头"。
前面已经多次使用过,它的原型为:
void rewind(FILE *fp);
fseek()函数 用来将 "位置指针" 移动到 "文件末尾"。
它的原型为:
int fseek(FILE *fp,long offset,int origin);
参数说明:
1. fp 为 文件指针,也是"被移动的文件"
2. offset为"偏移量",也就是要"移动"的字节数。
之所以为long类型,时希望"移动"的范围更大,能处理的文件更大。
offset为 "正" 时, "向后" 移动。
offse 为 "负" 时, "向前" 移动。
3. oringin为"起始位置",也就是"从何处开始计算偏移量"。
C语言规定的"起始位置"有三种,分别为"文件开头、当前位置和文件末尾"。
每个位置都有相对应的"常量"来表示:
具体如下:
起始点 常量名 常量值
文件开头 SEEK_SET 0
当前位置 SEEK_CUR 1
文件末尾 SEEK_END 2
例如,把位置指针移动到离文件开头100个字节处:
fseek(fp,100,0);
二、文件的随机读写
在"移动" 位置指针 之后,就可以用前面介绍的"任何一种" "读写函数" 进行读写了。
由于是"二进制文件",因此 常用"fread()函数"和"fwrite()函数"进行读写。
讲个程序例子吧:
//从键盘输入三组学生信息,保存到文件中,然后读取第二个学生的信息。
#include<stdio.h>
#define N 3
struct stu{
char name[10]; //姓名
int num;//学号
int age;//年龄
float score; //成绩
}boys[N],boy, *pboys;
int main()
{
FILE *fp;
int i;
pboys = boys;
if((fp=fopen("D:\\demo.txt","wb+")) == NULL)
{
printf("Cannot open file, press any key to exit!\n");
getch();
exit(1);
}
printf("Input data:\n");
for(i=0;i<N;i++,pboys++)
{
scanf("%s %d %d %f", pboys->name, &pboys->num, &pboys->age, &pboys->score);
}
fwrite(boys, sizeof(struct stu), N, fp); //写入三条学生信息
fseek(fp, sizeof(struct stu), SEEK_SET); //移动位置指针
fread(&boy, sizeof(struct stu), 1, fp); //读取一条学生信息
printf("%s %d %d %f\n", boy.name, boy.num, boy.age, boy.score);
fclose(fp);
return 0;
}
运行结果:
Input data:
Tom 2 15 90.5↙
Hua 1 14 99↙
Zhao 10 16 95.5↙
Hua 1 14 99.000000