计算机里为每个文件保留一个整数,这个整数表示下一次读写操作的位置。
这个位置一定在两个相邻字节之间
这个整数的数值就是头到这个位置之间包含的字节数,这个整数叫做文件的位置指针
当向文件里写入n个字节或从文件中获得n个字节后,位置指针会向后移动n个位置
1.ftell函数
可以获得当前的位置,例如:
在b.txt中按顺序写入26个字母,
#include<stdio.h>
int main()
{
int num ;
char ch = 0 ;
FILE *p_file = fopen("b.txt","rb") ;
if(p_file)
{
fread(&ch,sizeof(char) ,1 ,p_file ) ;
printf("%c\n",ch) ;
fread(&ch,sizeof(char) ,1 ,p_file ) ;
printf("%c\n",ch) ;
fread(&ch,sizeof(char) ,1 ,p_file ) ;
printf("%c\n",ch) ;
num = ftell(p_file) ;
printf("num = %d\n",num) ;
fclose(p_file) ;
p_file = NULL ;
}
return 0 ;
}
运行结果:a
b
c
num=3
2.rewind函数
可以把位置指针调整到文件开头,接上例
#include<stdio.h>
int main()
{
int num ;
char ch = 0 ;
FILE *p_file = fopen("b.txt","rb") ;
if(p_file)
{
fread(&ch,sizeof(char) ,1 ,p_file ) ;
printf("%c\n",ch) ;
fread(&ch,sizeof(char) ,1 ,p_file ) ;
printf("%c\n",ch) ;
rewind(p_file) ;
fread(&ch,sizeof(char) ,1 ,p_file ) ;
printf("%c\n",ch) ;
num = ftell(p_file) ;
printf("num = %d\n",num) ;
fclose(p_file) ;
p_file = NULL ;
}
return 0 ;
}
运行结果:
a
b
a
num = 1
3.fseek函数
可以将位置指针调整到任何位置,
需要选择一个基准位置并且还要指定目标位置和基准位置之间的距离
共有3个基准位置:
SEEK_SET 0把文件头作为基准位置
SEEK_CUR 1 把当前位置作为基准位置
SEEK_END 2把文件尾作为基准位置
如果目标位置在基准位置后,距离用负数表示
如果目标位置在基准位置前,距离用正数表示
距离的数值,就是两个位置之间包含的字节个数
int fseek(FILE *stream, long offset, int fromwhere);
int fseek(文件指针,偏移量,基准位置)
#include<stdio.h>
int main()
{
int num ;
char ch = 0 ;
FILE *p_file = fopen("b.txt","rb") ;
if(p_file)
{
fseek(p_file,2,SEEK_SET) ;
fread(&ch,sizeof(char) ,1 ,p_file ) ;
printf("SEEK_SET 2 :%c\n",ch) ;
fseek(p_file,5,SEEK_CUR) ;
fread(&ch,sizeof(char) ,1 ,p_file ) ;
printf("SEEK_CUR 5 :%c\n",ch) ;
fseek(p_file,-1,SEEK_END) ;//x
fread(&ch,sizeof(char) ,1 ,p_file ) ;
printf("SEEK -1:%c\n",ch) ;
num = ftell(p_file) ;
printf("num = %d\n",num) ;
fclose(p_file) ;
p_file = NULL ;
}
return 0 ;
}
运行结果:
SEEK_SET 2 :c
SEEK_CUR 5 :i
SEEK -1:‘\0’
num = 27
最后练习:先写一个将员工信息的函数存入info.bin文件
然后在另一个函数中只读id
empwrite.c
#include<stdio.h>
int main()
{
int num ;
char ch = 0 ;
FILE *p_file = fopen("b.txt","rb") ;
if(p_file)
{
fseek(p_file,2,SEEK_SET) ;
fread(&ch,sizeof(char) ,1 ,p_file ) ;
printf("SEEK_SET 2 :%c\n",ch) ;
fseek(p_file,5,SEEK_CUR) ;
fread(&ch,sizeof(char) ,1 ,p_file ) ;
printf("SEEK_CUR 5 :%c\n",ch) ;
fseek(p_file,-1,SEEK_END) ;//x
fread(&ch,sizeof(char) ,1 ,p_file ) ;
printf("SEEK -1:%c\n",ch) ;
num = ftell(p_file) ;
printf("num = %d\n",num) ;
fclose(p_file) ;
p_file = NULL ;
}
return 0 ;
}
empread.c
#include<stdio.h>
typedef struct{
int id ;
float sal;
char name[10] ;
}empinfo ;
int main()
{
int emp_id ;
FILE* p_file = fopen("info.bin","rb") ;
if(!p_file)
{
perror("open error!!!") ;
return -1 ;
}
rewind(p_file) ;
while(fread(&emp_id,sizeof(int),1,p_file))
{
printf("id = %d\n",emp_id) ;
fseek(p_file,16,SEEK_CUR) ;
}
fclose(p_file) ;
p_file = NULL ;
}
注意:偏移量,要考虑结构体的对齐