C语言_文件的位置指针

计算机里为每个文件保留一个整数,这个整数表示下一次读写操作的位置。

这个位置一定在两个相邻字节之间

这个整数的数值就是头到这个位置之间包含的字节数,这个整数叫做文件的位置指针

当向文件里写入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 ;
}

注意:偏移量,要考虑结构体的对齐

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值