IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> linux的fseek函数 -> 正文阅读

[C++知识库]linux的fseek函数

回顾

 #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 
重新把位置偏移到某个位置 
写也会在读的结尾继续输入
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-04-18 17:22:53  更:2022-04-18 17:23:49 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 23:47:29-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码