版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wangshuxuncom/article/details/84979136
int fseek(FILE * fp, long offset, int fromWhere):设定文件位置标记,方法参数说明:
fp:FILE类型指针,该指针对应的文件即是文件位置标记所标记的文件;
offset:偏移量;
fromWhere:偏移起始点,其值可以为SEEK_SET、SEEK_CUR和SEEK_END;
SEEK_SET:从文件开头处开始偏移
#include <stdio.h>
#include <stdlib.h>
int main(){
FILE * file = fopen("D:\\chars.dat","wb+");
if(file == NULL){
printf("无法打开文件");
exit(0);
}
char letters [] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
fwrite(letters,sizeof(char),26,file);
rewind(file);//fwrite方法执行过,文件位置标记在文件的末尾,如果不将文件位置标记重新指向文件开头,则执行下面fread方法没有结果;rewind方法等效于fseek(file,0L,SEEK_SET);
char letter;
fread(&letter,sizeof(char),1,file);
printf("%c\n", letter);//输出A
fread(&letter,sizeof(char),1,file);
printf("%c\n", letter);//输出B
rewind(file);
fseek(file,sizeof(char),SEEK_SET);//文件位置标记移到距离文件开头1个字符之后,即跳过字符A
fread(&letter,sizeof(char),1,file);
printf("%c\n", letter);//输出B
fseek(file,2*sizeof(char),SEEK_SET);//文件位置标记移到距离文件开头2个字符之后,即跳过字符AB
fread(&letter,sizeof(char),1,file);
printf("%c\n", letter);//输出C
fclose(file);
return 0;
}
SEEK_CUR:从当前文件位置标记处开始偏移
#include <stdio.h>
#include <stdlib.h>
int main(){
FILE * file = fopen("D:\\chars.dat","wb+");
if(file == NULL){
printf("无法打开文件");
exit(0);
}
char letters [] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
fwrite(letters,sizeof(char),26,file);
rewind(file);//fwrite方法执行过,文件位置标记在文件的末尾,如果不将文件位置标记重新指向文件开头,则执行下面fread方法没有结果;rewind方法等效于fseek(file,0L,SEEK_SET);
char letter;
fread(&letter,sizeof(char),1,file);
printf("%c\n", letter);//输出A
fread(&letter,sizeof(char),1,file);
printf("%c\n", letter);//输出B
fseek(file,0L,SEEK_SET);//将文件位置标记重新指向文件开头,等效于rewind(file);
fseek(file,sizeof(char),SEEK_CUR);//文件位置标记移到距离文件开头1个字符之后,即跳过字符A
fread(&letter,sizeof(char),1,file);//该行代码执行后文件位置标记指向B
printf("%c\n", letter);//输出B
fseek(file,2*sizeof(char),SEEK_CUR);//文件位置标记移到距离B 2个字符之后的位置,即跳过字符CD
fread(&letter,sizeof(char),1,file);
printf("%c\n", letter);//输出E
fclose(file);
return 0;
}
【例题】已知D盘根目录stud.dat文件存有10条学生信息,请将第1、3、5、7、9学生信息显示在屏幕上。
#include <stdio.h>
#include <stdlib.h>
int main(){
struct Student{
char name [10];
int num;
int age;
char addr [30];
} stud [5];
FILE * input = fopen("D:\\stud.dat","rb");
if(input == NULL){
printf("无法打开文件");
exit(0);
}
for(int i=0;i<10;i=i+2){
fread(&stud[i],sizeof(struct Student),1,input);
printf("%s %d %d %s\n",stud[i].name,stud[i].num,stud[i].age,stud[i].addr);
fseek(input,sizeof(struct Student),SEEK_CUR);
}
fclose(input);
return 0;
}
SEEK_END:从文件末尾处开始偏移
#include <stdio.h>
#include <stdlib.h>
int main(){
FILE * file = fopen("D:\\chars.dat","wb+");
if(file == NULL){
printf("无法打开文件");
exit(0);
}
char letters [] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
fwrite(letters,sizeof(char),26,file);
rewind(file);//fwrite方法执行过,文件位置标记在文件的末尾,如果不将文件位置标记重新指向文件开头,则执行下面fread方法没有结果;rewind方法等效于fseek(file,0L,SEEK_SET);
char letter;
fread(&letter,sizeof(char),1,file);
printf("%c\n", letter);//输出A
fread(&letter,sizeof(char),1,file);
printf("%c\n", letter);//输出B
rewind(file);//将文件位置标记重新指向文件开头
fseek(file,-sizeof(char),SEEK_END);//文件位置标记移到文件末尾前1个字符,即跳过文件结束符
fread(&letter,sizeof(char),1,file);
printf("%c\n", letter);//输出Z,此时文件位置标记指向B
fseek(file,-2*sizeof(char),SEEK_END);//文件位置标记移到文件末尾前2个字符,即跳过文件结束符和Z字符
fread(&letter,sizeof(char),1,file);
printf("%c\n", letter);//输出Y
fclose(file);
return 0;
}