简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!
优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀
人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.
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;
}