C++之lseek64应用总结(二百三十六)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!

优质专栏:Audio工程师进阶系列原创干货持续更新中……】🚀

人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.

更多原创,欢迎关注:Android系统攻城狮

欢迎关注Android系统攻城狮

1.前言

本篇目的:理解C++之lseek64用法。

2.lseek64介绍

lseek64是一个系统调用函数,用于在文件中定位文件指针的位置。它的目的是允许程序随机地访问文件,并在不同位置进行读取或写入操作。

lseek64函数的原型如下:

off64_t lseek64(int fd, off64_t offset, int whence);

参数说明:

  • fd:文件描述符,用于标识要进行操作的文件。
  • offset:指定了相对于whence参数中位置的位移量。
  • whence:指定了定位的参考位置,可以是以下值之一:
    • SEEK_SET:从文件开头开始计算偏移量。
    • SEEK_CUR:以当前文件指针位置为参考点计算偏移量。
    • SEEK_END:从文件末尾开始计算偏移量。

返回值为一个新的文件偏移量,若出错则返回-1。

lseek64的实现原理是通过改变文件描述符所绑定文件对象的偏移量来实现文件指针的定位。每个打开的文件都会有相应的文件对象,文件对象中包含文件的相关信息,例如文件位置指针,文件状态等。通过改变文件对象的偏移量,文件指针的位置也会相应地改变。

当调用lseek64函数时,操作系统会根据给定的偏移量和参考位置确定新的文件指针位置。然后将该位置更新到文件对象中,并返回新的文件偏移量给调用方。

需要注意的是,lseek64函数适用于大文件,对于普通文件可以使用lseek函数进行定位。lseek64主要用于支持超过 2GB 的文件大小的定位。

3.应用实例

<1>.将文件指针定位到文件开头

#include <iostream>
#include <fcntl.h>
#include <unistd.h>void seekToFileStart(int fd) {off64_t newPosition = lseek64(fd, 0, SEEK_SET);  // 文件指针定位到文件开头if (newPosition == -1) {std::cerr << "文件指针定位失败" << std::endl;} else {std::cout << "文件指针定位成功,新的位置为:" << newPosition << std::endl;}
}int main() {int fd = open("file.txt", O_RDONLY);  // 打开文件if (fd == -1) {std::cerr << "文件打开失败" << std::endl;return 1;}seekToFileStart(fd);  close(fd);  // 关闭文件return 0;
}

<2>.将文件指针定位到文件末尾

#include <iostream>
#include <fcntl.h>
#include <unistd.h>void seekToFileEnd(int fd) {off64_t newPosition = lseek64(fd, 0, SEEK_END);  // 文件指针定位到文件末尾if (newPosition == -1) {std::cerr << "文件指针定位失败" << std::endl;} else {std::cout << "文件指针定位成功,新的位置为:" << newPosition << std::endl;}
}int main() {int fd = open("file.txt", O_RDWR);  // 打开文件if (fd == -1) {std::cerr << "文件打开失败" << std::endl;return 1;}seekToFileEnd(fd);  close(fd);  // 关闭文件return 0;
}

<3>.将文件指针向后移动100个字节

#include <iostream>
#include <fcntl.h>
#include <unistd.h>void seekForward(int fd, off64_t offset) {off64_t newPosition = lseek64(fd, offset, SEEK_CUR);  // 文件指针向后移动offset字节if (newPosition == -1) {std::cerr << "文件指针定位失败" << std::endl;} else {std::cout << "文件指针定位成功,新的位置为:" << newPosition << std::endl;}
}int main() {int fd = open("file.txt", O_WRONLY);  // 打开文件if (fd == -1) {std::cerr << "文件打开失败" << std::endl;return 1;}seekForward(fd, 100);  // 向后移动100个字节close(fd);  // 关闭文件return 0;
}

<4>.将文件指针向前移动200个字节

#include <iostream>
#include <fcntl.h>
#include <unistd.h>void seekBackward(int fd, off64_t offset) {off64_t newPosition = lseek64(fd, -offset, SEEK_CUR);  // 文件指针向前移动offset字节if (newPosition == -1) {std::cerr << "文件指针定位失败" << std::endl;} else {std::cout << "文件指针定位成功,新的位置为:" << newPosition << std::endl;}
}int main() {int fd = open("file.txt", O_RDWR);  // 打开文件if (fd == -1) {std::cerr << "文件打开失败" << std::endl;return 1;}seekBackward(fd, 200);  //向前移动200个字节close(fd);  // 关闭文件return 0;
}

<5>.将文件指针定位到离文件末尾处100个字节的位置

#include <iostream>
#include <fcntl.h>
#include <unistd.h>void seekFromEnd(int fd, off64_t offset) {off64_t newPosition = lseek64(fd, -offset, SEEK_END);  // 文件指针定位到离文件末尾处offset字节的位置if (newPosition == -1) {std::cerr << "文件指针定位失败" << std::endl;} else {std::cout << "文件指针定位成功,新的位置为:" << newPosition << std::endl;}
}int main() {int fd = open("file.txt", O_WRONLY);  // 打开文件if (fd == -1) {std::cerr << "文件打开失败" << std::endl;return 1;}seekFromEnd(fd, 100);  //定位到离文件末尾处100个字节的位置close(fd);  // 关闭文件return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/86769.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CMU15-445 format\clang-format\clang-tidy 失败

CMU15-445 format\clang-format\clang-tidy 失败 问题修改 问题 -- Setting build type to Debug as none was specified. -- Youre using Clang 14.0.0 CMake Warning at CMakeLists.txt:67 (message):BusTub/main couldnt find clang-format.CMake Warning at CMakeLists.tx…

YouCompleteMe 安装踩坑

Vim里下载完插件后&#xff0c;打开vim&#xff0c;可能遇到以下报错 The ycmd server SHUT DOWN (restart with ‘:YcmRestartServer’). Unexpected exit code 1 没有安装server&#xff0c;进入其目录&#xff0c;C语言类的运行 python3 install.py --clangd-completer --v…

下拉框组件的封装(element ui )

目录 实现思路 创建通用的下拉选择框组件 如何使用这个组件 结语 当你使用Vue.js构建Web应用时&#xff0c;封装可复用组件是提高开发效率和代码可维护性的关键之一。在这篇文章中&#xff0c;我们将探讨如何使用Vue.js来创建一个通用的下拉选择框组件&#xff0c;以及如何…

磁盘检测工具,根据lba查找对应文件

Q: 磁盘检测工具&#xff0c;如何根据损坏的lba查找对应的文件? 1.运行cmd&#xff0c;输入 fsutil fsinfo ntfsinfo e: 2.从上述结果中找到 "每扇区字节数&#xff08;Bytes Per Sector&#xff09;"、"每个簇字节数&#xff08;Bytes Per Cluster&#xff0…

Python中使用EMD(经验模态分解)

在Python中使用EMD&#xff08;经验模态分解&#xff09;进行信号分解时&#xff0c;通常可以设置信号分解的数目。EMD算法的目标是将信号分解成多个称为“本征模态函数”&#xff08;Intrinsic Mode Functions&#xff0c;简称IMF&#xff09;的成分&#xff0c;每个IMF都代表…

【设计模式】组合模式

文章目录 1.组合模式定义2.组合模式的结构2.1. 安全式组合模式的结构2.2.透明式组合模式的结构 3.组合模式实战案例3.1.场景说明3.2.关系类图3.3.代码实现 4.组合模式优缺点5.组合模式适用场景6.组合模式总结 主页传送门&#xff1a;&#x1f481; 传送 1.组合模式定义 组合模式…

服务注册发现_actuator微服务信息完善

SpringCloud体系里的&#xff0c;服务实体向eureka注册时&#xff0c;注册名默认是IP名:应用名:应用端口名。 问题&#xff1a; 自定义服务在Eureka上的实例名怎么弄呢 在服务提供者pom中配置Actuator依赖 <!-- actuator监控信息完善 --> <dependency><groupId…

2 C++中的引用

C中的引用 上节说到&#xff0c;变量名实际上是一段连续存储空间的别名。很显然我们可以将其命名为其它名字&#xff0c;就像我们有乳名、小名一样。 C引入了引用的概念。 引用可以看作一个已定义变量的别名引用的语法 type& name variate;普通引用在声明时必须用其它的…

springboot和vue:二、springboot特点介绍+热部署热更新

springboot特点介绍 能够使用内嵌的Tomcat、Jetty服务器&#xff0c;不需要部署war文件。提供定制化的启动器Starters&#xff0c;简化Maven配置&#xff0c;开箱即用。纯Java配置&#xff0c;没有代码生成&#xff0c;也不需要XML配置。提供了生产级的服务监控方案&#xff0…

如何在 SOLIDWORKS中创建零件模板 硕迪科技

作为一款多功能且可大量定制的 3D CAD 软件&#xff0c;SOLIDWORKS模板可以通过自定义属性包含大量数据。可以通过为SOLIDWORKS零件、装配体和工程图创建模板来利用这些模板。 与其他一些CAD软件不同&#xff0c;SOLIDWORKS不限制您可以创建的模板数量 - 您可以根据需要创建任…

在项目中,关于前端实现数据可视化的技术选择

前言 在项目中&#xff0c;数据可视化以图表、报表类型为主。 需求背景 技术框架是Vue2.x版本&#xff0c;组件库是Ant Design of Vue能够支撑足够多的图表类型开发图表大小/位置能够随意变动图表样式需要支持丰富多样的用户配置强大、开放的图表语法支持复杂的数据可视化场景…

UG NX二次开发(C++)-采用std::vector对体对象的质心进行排序

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1、前言2、体对象质心结构体的构造3、采用NXOpen获取part中的所有体对象4、通过遍历体对象集合来实现std::vector<MyBody>的赋值5、对结构体排序6、调用的完整源代码7、生成dll并测试一、pan…

【深度学习实验】前馈神经网络(四):自定义逻辑回归模型:前向传播、反向传播算法

目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 三、实验内容 0. 导入必要的工具包 1. 逻辑回归Logistic类 a. 构造函数__init__ b. __call__(self, x)方法 c. 前向传播forward d. 反向传播backward 2. 模型训练 3. 代码整合 一、实验介绍 实现逻…

如何实现设备可视化系统建设?

随着工业生产的复杂性和精细化程度不断提升&#xff0c;设备可视化已经成为现代工厂运营管理的重要工具之一。通过实时监控、数据分析和图像呈现等技术手段&#xff0c;设备可视化能够提供给管理者和操作人员更加直观、精确的信息&#xff0c;进而提高生产效率、降低运营成本、…

Linux 目录结构介绍

对上面的说明: root 目录 &#xff1a; linux 超级权限 root 的主目录 home 目录 &#xff1a; 系统默认的用户主目录&#xff0c;如果添加用户是不指定用户的主目录&#xff0c;默认在/home 下创建与用户同名的文件夹 bin 目录 &#xff1a; 存放系统所需要的重要命令&am…

uniapp Echart X轴Y轴文字被遮挡怎么办,或未能铺满整个容器

有时候布局太小&#xff0c;使用echarts&#xff0c;x轴y轴文字容易被遮挡&#xff0c;怎么解决这个问题呢&#xff0c;或者是未能铺满整个容器。 方法1&#xff1a; 直接设置 containLabel 字段 options: { grid: { containLabel: true, },} 方法2: 间接设置&#xff0c;但是…

vue3中withDefaults是什么

问: const props withDefaults(defineProps<{// 数据列表lotteryList: { pic: string; name?: string }[];// 中奖idwinId: number;// 抽奖初始转动速度initSpeed: number;// 抽奖最快转动速度fastSpeed: number;// 抽奖最慢转动速度slowSpeed: number;// 基本圈数baseCi…

VPP ARC和feature初始化

遍历feature_main主结构的next_arc单向链表&#xff0c;按照顺序为每个ARC注册结构分配索引&#xff08;feature_arc_index&#xff09;&#xff0c;如果注册ARC的时候为成员arc_index_ptr附了值&#xff0c;将ARC索引写入此值。 将arc_name作为key&#xff0c;areg注册结构为…

为什么添加了@EnableDiscoveryClient注解就可以实现服务注册

添加了nacos的maven依赖之后&#xff0c;只需要在启动类上加一个EnableDiscoveryClient注解就可以实现服务注册&#xff0c;这个注解为什么可以实现&#xff1f; EnableDiscoveryClient注解 进去到EnableDiscoveryClient注解之后&#xff0c;只有简单的几行代码&#xff1a; …

【新版】系统架构设计师 - 案例分析 - 信息安全

个人总结&#xff0c;仅供参考&#xff0c;欢迎加好友一起讨论 文章目录 架构 - 案例分析 - 信息安全安全架构安全模型分类BLP模型Biba模型Chinese Wall模型 信息安全整体架构设计WPDRRC模型各模型安全防范功能 网络安全体系架构设计开放系统互联安全体系结构安全服务与安全机制…