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 
#include 
#include 

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 
#include 
#include 

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 
#include 
#include 

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 
#include 
#include 

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 
#include 
#include 

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;
}

你可能感兴趣的:(C++入门系列,c++,开发语言)