linux的fseek函数

  • Post author:
  • Post category:linux




回顾

 #include<stdio.h>
#include<string.h>


int  main()
{

  FILE *fd;
  int ws;
  int rs;
  int fk;
  char writebuff[128];
  char readbuff[128]={0};
  char *str="hwllo wrold";

  strcpy(writebuff,str);
  fd=fopen("vvvvv","r+");

  if(fd==NULL)//打开失败
  {
   printf("fopen is error\n");
    return -1;
  }
  printf("fopen is succssed\n");  
   /*
   rs=fread(readbuff,4,2,fd);
   if(ws<=0)
   {
      printf("fread is error\n");
      return -4;
   }
    printf("fread is %s\n",readbuff);
      */
    ws=fwrite(writebuff,4,1,fd);//写函数 
   if(ws<=0)//写错误
   {
      printf("fwrite is error\n");
      return -1;
   }
    printf("fwrite is succssed\n");

  fclose(fd);

  return 0;
}
因为读写不能同时进行 所以 先把读函数屏蔽了 
写函数成功了 再把读函数取消屏蔽。

在这里插入图片描述

下面学一个fseek 函数 
和之前的lseek 函数有点类似 



fseek函数

在这里插入图片描述

fseek 
long offest:偏移量
int framewhere:起始位置 这样的和lseek函数的 形参 int whence
意思是一样的 

不理解回去看看。

直接写代码  
先用 SEEK_SET :一开头为起始位置
配合读写看效果 

重新编译下载写函数 (注意很重要 )

把这步记为第一步 
#include<stdio.h>
#include<string.h>

int  main()
{

  FILE *fd;
  int ws;
  int rs;
  int fk;
  char writebuff[128];
  char readbuff[128]={0};
  char *str="hwllowrold";

  strcpy(writebuff,str);
  fd=fopen("vvvvv","w+");//w+ 没有就 创建

  if(fd==NULL)
  {
   printf("fopen is error\n");
    return -1;

  }
  printf("fopen is succssed\n");
  
    ws=fwrite(writebuff,4,2,fd);//写函数
   if(ws<=0)//异常情况
   {
      printf("fwrite is error\n");
      return -1;
   }
    printf("fwrite is succssed\n");

    fclose(fd);
    return 0;
}

在这里插入图片描述

因为 fseek 配合 fread fwrite 使用 效果会明显 

在 fwrite 基础 上 加入fread 并且把 w+ 改为 r+

#include<stdio.h>
#include<string.h>


int  main()
{

  FILE *fd;
  int ws;
  int rs;
  int fk;
  char writebuff[128];
  char readbuff[128]={0};
  char *str="hwllowrold";
  strcpy(writebuff,str);
  fd=fopen("vvvvv","r+");//r+ 可读可写 
 
  if(fd==NULL)
  {
   printf("fopen is error\n");
    return -1;
  }
  printf("fopen is succssed\n");   
   rs=fread(readbuff,4,2,fd);//读函数 
   if(ws<=0)//异常情况
   {
      printf("fread is error\n");
      return -4;
   }
    printf("fread is %s\n",readbuff);

    ws=fwrite(writebuff,4,2,fd);//写函数 
   if(ws<=0)//异常情况
   {
      printf("fwrite is error\n");
      return -1;
   }
    printf("fwrite is succssed\n");
 
   fclose(fd);
   return 0;

}

在这里插入图片描述



fseek 函数 的 SEEK_SET 的用处

要点 2

为什么出现查看 写的内容多了一倍呢  因为在读的时候,读到后面 又是写的开始 
因为没有光标把它移动到第一个位置 重新写入 
#include<stdio.h>
#include<string.h>


int  main()
{

  FILE *fd;
  int ws;
  int rs;
  int fk;
  char writebuff[128];
  char readbuff[128]={0};
  char *str="hwllowrold";

  strcpy(writebuff,str);
  fd=fopen("vvvvv","r+");
  if(fd==NULL)//异常情况
  {
   printf("fopen is error\n");
    return -1;
  }
  printf("fopen is succssed\n");
   
   rs=fread(readbuff,4,2,fd);//读函数 
   if(ws<=0)//异常情况
   {
      printf("fread is error\n");
      return -4;
   }
    printf("fread is %s\n",readbuff);
    
    fk=fseek(fd,0,SEEK_SET);//读完之后 把地址偏移到 开始 第0 的位置 
    
    if(fk)//异常情况 
    {
       printf("fseek is error\n");
       return -55;
    }

      ws=fwrite(writebuff,4,2,fd);//以开头 写入 4*2 长度 
   if(ws<=0)//异常情况
   {
      printf("fwrite is error\n");
      return -1;
   }
    printf("fwrite is succssed\n");

  fclose(fd);
  return 0;

}

SEEK_SET :以开始为起始地址 即第0个位置 

在这里插入图片描述



fseek 函数 的 SEEK_END 的用处

#include<stdio.h>
#include<string.h>

int  main()
{

  FILE *fd;
  int ws;
  int rs;
  int fk;
  char writebuff[128];
  char readbuff[128]={0};
  char *str="hwllowrold";

  strcpy(writebuff,str);
  fd=fopen("vvvvv","r+");

  if(fd==NULL)
  {
   printf("fopen is error\n");
    return -1;

  }
  printf("fopen is succssed\n");
   
   rs=fread(readbuff,4,2,fd);//读函数
   if(ws<=0)//异常情况
   {
      printf("fread is error\n");
      return -4;
   }
    printf("fread is %s\n",readbuff);
    
    fk=fseek(fd,8,SEEK_END);//以读的结尾 增加8个偏移
    
    if(fk)//异常情况
    {
       printf("fseek is error\n");
       return -55;
    }

      ws=fwrite(writebuff,4,2,fd);以读的结尾开始写入 4*2 长度 
   if(ws<=0)//异常情况
   {
      printf("fwrite is error\n");
      return -1;
   }
    printf("fwrite is succssed\n");

  fclose(fd);
  return 0;

}

SEEK_END:读的尾部 (写结果多了一倍)

在这里插入图片描述



fseek 函数 的 SEEK_CUR 的用处

因为我连用了 SEEK_END SEEK_SET 导致现在的读的尾部最后到了15
那我应该 SEEK_CUR 

在这里插入图片描述

 #include<stdio.h>
#include<string.h>


int  main()
{

  FILE *fd;
  int ws;
  int rs;
  int fk;
  char writebuff[128];
  char readbuff[128]={0};
  char *str="hwllowrold";

  strcpy(writebuff,str);
  fd=fopen("vvvvv","r+");

  if(fd==NULL)//异常情况
  {
   printf("fopen is error\n");
    return -1;

  }
  printf("fopen is succssed\n");
  
   
   rs=fread(readbuff,4,2,fd);//读函数
   if(ws<=0)//异常情况
   {
      printf("fread is error\n");
      return -4;
   }
    printf("fread is %s\n",readbuff);
    
    fk=fseek(fd,16,SEEK_CUR); //16位当前的新地址
    
    if(fk)//异常情况 
    {
       printf("fseek is error\n");
       return -55;
    }

      ws=fwrite(writebuff,4,2,fd); //以读的尾部  写入4*2个长度 
   if(ws<=0)//异常情况
   {
      printf("fwrite is error\n");
      return -1;
   }
    printf("fwrite is succssed\n");

  fclose(fd);

  return 0;

}
 
SEEK_CUR :以当前 xxx  为起点  fwrite (4*2) 往后写入 8个长度 

在这里插入图片描述

连续使用 注意偏移问题。
注意读出到了哪个位置 
其实参数写对了 一直就是被假象给骗了 因为读的位置一直在最后
 而你的偏移却没有写对 导致一直覆盖 其实想法是对了 
读完之后一定在偏移到字符最后 
如果不用lseek fseek 
重新把位置偏移到某个位置 
写也会在读的结尾继续输入
SEEK_SET :每次都会偏移到首位
SEEK_END:类似复制粘贴 
SEEK_CUR:固定长度



版权声明:本文为weixin_59349642原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。