文件定位

简介: 文件定位

文件打开时,会将文件偏移量设置为指向文件开始,以后每次读写将自动对其进行调整,以指向已读或已写数据后的下一字节。这一点,与标准I/O中的流的定位是一样的。

#include <sys/types.h>
#include <unistd.h>
off_t lseek(int fd, off_t offset, int whence);点击复制复制失败已复制


参数 fd 指代已打开的文件,参数 whence 用来设置定位的位置,可以设置 3 种模式: SEEK_SETSEEK_CURSEEK_END ,分别表示定位到文件的开始处当前位置以及末尾offset 依然表示在第三个参数定位的基础上再次发生偏移。函数的返回值为当前定位的位置相对于文件开始处的偏移量。


示例

文件数据的复制

从一个文件(源文件)中读取最后 10KB 的数据并复制到另一个文件中(目标文件)。源文件以只读的方式打开,目标文件以只写的方式打开,若目标文件不存在,可以创建并设置权限的初始值为 0664 (文件所属用户可读写,文件所属组和其他用户只能读)。

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#define BUFFER_SIZE 1024
#define SRC_FILE "src_file"
#define DEST_FILE "dest_file"
#define OFFSET 10240
#define errlog(errmsg)                                                         \
  perror(errmsg);                                                              \
  printf("--%s--%s--%d--\n", __FILE__, __FUNCTION__, __LINE__);                \
  return -1;
int main(int argc, const char *argv[]) {
  int fds, fdd;
  unsigned char buf[BUFFER_SIZE];
  ssize_t read_led;
  if ((fds = open(SRC_FILE, O_RDONLY)) < 0) {
    errlog("open error");
  }
  if ((fdd = open(DEST_FILE, O_WRONLY | O_CREAT | O_TRUNC, 0664)) < 0) {
    errlog("open error");
  }
  lseek(fds, -OFFSET, SEEK_END);
  while ((read_led = read(fds, buf, sizeof(buf))) > 0) {
    write(fdd, buf, read_led);
  }
  close(fds);
  close(fdd);
  return 0;
}点击复制复制失败已复制


文件读写位置的定位确定之后,程序就可以通过定位操作完成文件数据的截取或合并等问题。


生成空洞文件

在笔记文件的长度中介绍了空洞文件,这里我们演示如何生成一个空洞文件。

#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#define N 32
int main(int argc, const char *argv[]) {
  int fd;
  char buf1[N] = "abcdefg";
  char buf2[N] = "hijklmn";
  fd = open("test.txt", O_RDWR | O_CREAT | O_TRUNC, 0664);
  write(fd, buf1, strlen(buf1));
  lseek(fd, 65536, SEEK_CUR);
  write(fd, buf2, strlen(buf2));
  return 0;
}点击复制复制失败已复制


上述代码通过在文件数据末尾,进行重新读写位置的定位(代码选择偏移 65536 字节),偏移之后再写入数据,则会在中间形成没有数据的空洞。


编译运行,查看生成的 test.txt 文件:

$ gcc main.c && ./a.out 
$ od -c test.txt
0000000   a   b   c   d   e   f   g  \0  \0  \0  \0  \0  \0  \0  \0  \0
0000020  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0
*
0200000  \0  \0  \0  \0  \0  \0  \0   h   i   j   k   l   m   n
0200016点击复制复制失败已复制


提示

test.txt 文件在系统中显示为 65.5kB

目录
相关文章
|
并行计算 PyTorch 算法框架/工具
社区供稿 | 本地部署通义千问大模型做RAG验证
这篇文章中,我们通过将模搭社区开源的大模型部署到本地,并实现简单的对话和RAG。
|
4月前
|
存储 数据可视化 Python
单细胞RNA速率分析: scVelo入门教程
单细胞RNA速率分析: scVelo入门教程
单细胞RNA速率分析: scVelo入门教程
|
4月前
|
移动开发 缓存 开发框架
轻型社交同城交友圈子系统/兴趣爱好搭子聊天APP/同城本地行业信息圈子论坛
基于 UniApp 和 ThinkPHP6 构建,实现多端同步的轻量级社交系统。前端采用 UniApp 跨端开发框架,支持微信小程序、H5、APP 等多平台,结合 Vue.js 语法与图鸟 UI 组件库,快速构建美观界面。后端使用 TP6 提供 RESTful API,搭配 MySQL 数据库与 Redis 缓存优化性能。核心功能包括兴趣圈子管理、即时通讯、付费圈子、广告与会员体系等。同时,通过七牛云内容检测与实名认证保障社区安全,采用 Nginx+Redis 高并发架构确保稳定性。免费源码,适合开发者快速搭建同城社交平台,并可通过 AI 推荐与 AR 功能进一步提升用户体验。
396 6
|
11月前
|
C语言 C++
C 语言的关键字 static 和 C++ 的关键字 static 有什么区别
在C语言中,`static`关键字主要用于变量声明,使得该变量的作用域被限制在其被声明的函数内部,且在整个程序运行期间保留其值。而在C++中,除了继承了C的特性外,`static`还可以用于类成员,使该成员被所有类实例共享,同时在类外进行初始化。这使得C++中的`static`具有更广泛的应用场景,不仅限于控制变量的作用域和生存期。
245 10
|
11月前
|
Cloud Native Java API
聊聊从单体到微服务架构服务演化过程
本文介绍了从单体应用到微服务再到云原生架构的演进过程。单体应用虽易于搭建和部署,但难以局部更新;面向服务架构(SOA)通过模块化和服务总线提升了组件复用性和分布式部署能力;微服务则进一步实现了服务的独立开发与部署,提高了灵活性;云原生架构则利用容器化、微服务和自动化工具,实现了应用在动态环境中的弹性扩展与高效管理。这一演进体现了软件架构向着更灵活、更高效的方向发展。
|
8月前
|
机器学习/深度学习 运维 分布式计算
Pandas数据应用:异常检测
本文介绍如何使用Pandas进行异常检测,涵盖异常值定义及其对数据分析的影响。通过简单统计方法(如均值+3标准差)、箱线图法(基于四分位距IQR)和基于密度的方法(如DBSCAN),并提供代码案例。同时,针对数据类型不匹配、缺失值处理不当及大数据量性能问题等常见报错给出解决方案。掌握这些技术有助于提高数据分析的准确性和可靠性。
282 19
|
11月前
|
存储 数据处理
GDPR
【10月更文挑战第7天】GDPR
494 7
|
10月前
|
监控 并行计算 搜索推荐
量子计算与医疗健康:个性化治疗的未来
量子计算以其强大的并行处理能力,正在医疗健康领域引发革命,尤其是在个性化治疗方面。本文探讨了量子计算在高效处理医疗数据、精确模拟生物分子、优化医疗资源分配等方面的应用,以及面临的挑战和未来前景。
西门子S7-1200编程实例,移位和循环移位指令如何使用?
西门子S7-1200的移位指令包括左移位指令和右移位指令,循环移位指令包括循环左移位指令和循环右移位指令。
西门子S7-1200编程实例,移位和循环移位指令如何使用?
github设置仓库可见性 私人仓库设置
github设置仓库可见性 私人仓库设置
741 0