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

news2025/1/11 5:58:50

简介: 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.coloradmin.cn/o/1037589.html

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

相关文章

基于STM32的宠物托运智能控制系统的设计(第十七届研电赛)

一、功能介绍 使用STM32作为主控设备&#xff0c;通过DHT11温湿度传感器、多合一空气质量检测传感器以及压力传感器对宠物的托运环境中的温湿度、二氧化碳浓度和食物与水的重量进行采集&#xff0c;将采集到的信息在本地LCD显示屏上显示&#xff0c;同时&#xff0c;使用4G模块…

IO模型学习

一、IO读写的基本原理 一个原则&#xff1a;操作系统将内存划分为两部分&#xff1a;一个是内核空间&#xff0c;一个是用户空间。在linux操作系统中&#xff0c;内核模块运行在内核空间&#xff0c;相应的进程处在内核态&#xff1b;用户程序运行在用户态&#xff0c;对应的进…

Vis.js教程(一):基础教程

1、Vis.js是什么 一个动态的、基于浏览器的可视化库。 该库的设计易于使用&#xff0c;能够处理大量动态数据&#xff0c;并能够对数据进行操作和交互。 该库由 DataSet、Timeline、Network、Graph2d 和 Graph3d 组件组成。 Vis.js官网&#xff1a;https://visjs.org/ github…

MS COCO数据集介绍以及pycocotools使用

MS COCO数据集介绍以及pycocotools使用 1、MS COCO数据集简介2、MS COCO数据集目录结构3、 MS COCO标注文件格式3.1 使用Python的json库查看3.2 使用官方cocoAPI查看 4、目标检测验证任务mAP 1、MS COCO数据集简介 2、MS COCO数据集目录结构 ├── coco2017: 数据集根目录├─…

Elasticsearch(Es搜索(简单使用、全文查询、复合查询)、地理位置查询、特殊查询、聚合操作、桶聚合、管道聚合)

Elasticsearch&#xff08;三&#xff09;——Es搜索&#xff08;简单使用、全文查询、复合查询&#xff09;、地理位置查询、特殊查询、聚合操作、桶聚合、管道聚合 一、Es搜索 这里的 Es 数据博主自己上网找的&#xff0c;为了练习 Es 搜索。 1、Elasticsearch 搜索入门 …

<十二>objectARX开发:Arx注册命令类型的含义以及颜色索引对应RGB值

1、注册命令类型 我们经常在acrxEntryPoint.cpp中看到注册命令如下: 那么各个宏定义代表什么意思呢? 主标识:(常用的) ACRX_CMD_MODAL: 在别的命令执行的时候该命令不会在其中执行。ACRX_CMD_TRANSPARENT: 命令可以再其它命令中执行,但在该标志下ads_sssetfirst()不能使…

Python实现猎人猎物优化算法(HPO)优化LightGBM回归模型(LGBMRegressor算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 猎人猎物优化搜索算法(Hunter–prey optimizer, HPO)是由Naruei& Keynia于2022年提出的一种最新的…

MySQL学习笔记13

DISTINCT数据去重&#xff1a; 案例&#xff1a;获取tb_student学生表学员年龄的分布情况。 mysql> select * from tb_student; ------------------------------------------------- | id | name | age | gender | address | --------------------------…

Go内置函数make和new的区别?

首先纠正一下make 和 new 是内置函数&#xff0c;不是关键字。 变量初始化&#xff0c;一般分为2步&#xff0c;变量声明变量内存分配&#xff0c;var 关键字就是用来声明变量的&#xff0c;new和make 函数主要是用来分配内存的。 var 声明值类型的变量时&#xff0c;系统会默…

[数据结构】栈和队列

目录 1.栈 1.1概念 1.2 栈的使用 1.3.栈的模拟实现 2.队列 2.1概念 2.2队列的使用 2.3队列的模拟实现 2.4 循环队列 2.5双端队列 1.栈 1.1概念 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一…

PPT系统化学习 - 第1天

文章目录 更改PPT主题更改最大撤回次数自动保存禁止PPT压缩图片字体嵌入PPTPPT导出为PDFPPT导出为图片PPT导出为图片型幻灯片PPT导出成视频添加参考线设置默认字体设置默认形状建立模板、保存模板、使用模板建立模板保存模板使用模板 更改PPT主题 更改PPT的主题&#xff1a; 夜…

如何进行销售漏斗管理?

本文将为大家讲解&#xff1a;如何进行销售漏斗管理&#xff1f; 销售漏斗管理是现代销售管理的核心概念之一。它将销售过程分解为一系列阶段&#xff0c;从而帮助销售团队更有效地跟踪和管理潜在客户。本文将深入探讨销售漏斗管理的方法&#xff0c;并结合简道云CRM的实际应用…

【深度学习推荐系统 工程篇】三、浅析FastTransFormer看 GPU推理优化 思路

前言 在搜索/推荐场景中&#xff08;一般是CTR/CVR预估&#xff09;Serving的模型一般是稀疏参数占比比较大&#xff0c;工程落地方面会遇到两方面的困难&#xff1a; 稀疏参数的存储/IO网络结构的优化 对于稀疏参数的存储/IO&#xff0c;在上一篇【深度学习推荐系统 工程篇…

MySQL查询(基础到高级)

目录 一、单表查询&#xff1a; 1.基本查询&#xff1a; 1.1 查询多个字段&#xff1a; 1.2 去除重复记录&#xff1a; 2. 条件查询&#xff1a; 2.1 语法 2.2 条件分类&#xff1a; 比较运算符&#xff1a; between..and..使用示例&#xff1a; ​编辑 in(..) 使用示例&…

InfiniTAM v3中localVBA的使用原理

注意&#xff1a;以下是我对InfiniTAM v3代码的理解 初始化&#xff1a;假设预先设定的block数量长度为10&#xff0c;localVBA初始化后如下图 voxelBlocks的内存已经分配&#xff0c;但都是空的allocationList被初始化为allocationList[i]i&#xff0c;表示任意访问allocatio…

【数据开发】数据全栈知识架构,数据(平台、开发、管理、分析)

文章目录 一、数据全栈知识架构1、数据方法&#xff08;思维&#xff0c;统计学&#xff0c;实践&#xff0c;北极星&#xff09;2、数据工具&#xff1a;数据仓库3、数据规范 二、数据分析工具1、大数据平台2、数据开发&#xff1a;入库计算&#xff08;重点&#xff09;3、数…

WP篇 某网杯WEBAWD踩坑

某网杯 事件回顾赛题环境 坑木马访问JSP显示空白Ubuntu与Mysql问题框架选择idea 事件回顾 虽然没有参与本次AWD&#xff0c;但是看到另外一只队伍down下来的文件&#xff0c;我还是忍不住心动了&#xff0c;于是决定复现一番&#xff0c;因为某些原因&#xff0c;详细的wp和复…

c#:System.Text.Json 的使用三(从Newtonsoft迁移)

环境&#xff1a; .net 6.0vs2022 系列篇&#xff1a; 《c#&#xff1a;System.Text.Json 的使用一》 《c#&#xff1a;System.Text.Json 的使用二》 《c#&#xff1a;System.Text.Json 的使用三&#xff08;从Newtonsoft迁移&#xff09;》 参考&#xff1a; 《MSDN: 从 Newt…

【vue2第二十章】vuex使用 (state,mutations,actions,getters)

vuex是什么&#xff1f; Vuex是一个用于Vue.js应用程序的状态管理模式。它允许您在应用程序中管理共享状态&#xff0c;并以可预测的方式进行状态更新。Vuex集成了Vue的响应式系统&#xff0c;使得状态的变化能够自动地更新视图。使用Vuex&#xff0c;您可以将应用程序的状态集…

华为云云耀云服务器L实例评测 |云服务器性能评测

通过上一篇文章华为云云耀云服务器 L 实例评测 &#xff5c;云服务器选购&#xff0c;我已经购买了一台 Centos 系统的云耀云服务器 L 实例。 在获得云耀云服务器 L 实例后&#xff0c;首要任务是熟悉云耀云服务器 L 实例的性能&#xff0c;对云耀云服务器 L 实例的性能进行测…