文件位置标记及其定位
顺序读写文件时,每读写一个数据后,文件位置标记顺序向后移一个位置,然后在下一次执行读写操作时把数据写入指针所指的位置。
直到把全部数据读写完,此时文件位置标记在最后一个数据之后。
如若需要人为移动文件标记的位置来读写操作,可使用以下函数:
rewind(文件类型指针)
rewind()函数使文件位置标记指向文件开头;
rewind(fp_read);
fseek(文件类型指针,位移量,起始点)
fseek()函数改变文件位置标记
起始点含义:
起始点 名字 用数字标记
文件开始位置 SEEK_SET 0
文件当前位置 SEEK_CUR 1
文件末尾位置 SEEK_END 2
位移量:
位移量指以起始点为基点,向前移动的字节数。
位移量应是long型数据(L)
eg:
fseek(fp,100L,0); //将文件位置标记向前移到离文件开头100个字节处
fseek(fp,50L,1); //将文件位置标记前移到离当前位置50个字节处
fseek(fp,-10L,2); //将文件位置标记从文件末尾处向后退10个字节
实例
随机读写数据文件data_stu.dat;将文件中的第1、3、5、7、9个学生数据输出在屏幕上,并保存到新文件data_stu_singular.dat。
/*
Name: random_fr_fw
Author: Liweidong
Date: 13/07/18 17:14
Description: 随机读写数据文件
将文件中的第1、3、5、7、9个学生数据输出在屏幕上,并保存到新文件 data_stu_singular.dat
*/
#include <stdio.h>
#include <stdio.h>
#define SIZE 10
struct student{
char name[20];
int num;
int age;
char addr[20];
}stu[SIZE];
void main() {
FILE *fp_read,*fp_write;
int i;
if( !(fp_write = fopen("data_stu_singular","wb"))) {
printf("cannot open the file data_stu_singular!\n");
return;
}
if( !(fp_read = fopen("data_stu.dat","rb"))) {
printf("cannot open the file data_stu.dat.txt!\n");
return;
}
printf("name\tnum\tage\taddr\n");
for(i=0; i<SIZE; i+=2) {
fseek(fp_read,i*sizeof(struct student),0);
fread(&stu[i],sizeof(struct student),1,fp_read);
fwrite(&stu[i],sizeof(struct student),1,fp_write);
printf("%s\t%d\t%d\t%s\n",stu[i].name,stu[i].num,stu[i].age,stu[i].addr);
}
fclose(fp_read);
fclose(fp_write);
printf("Successful storage!\n");
}
运行结果
成功读取数据。