当前位置: 首页 > news >正文

Linux系统编程——文件的光标移动

光标移动(lseek)

主要用于不断对文件写入数据或读取数据的的用法,每次写入数据后光标在数据尾,若要进行读取则只会没法读取到光标前的数据,这个时候就不需要重启文件,只需对光标位置做出调整就可以读取数据

使用lseek函数需要包含以下两个头文件

#include <sys/types.h>
#include <unistd.h>

lseek的函数定义格式

 off_t lseek(int fd, off_t offset, int whence);

函数定义的参数解读

int fd:fd为创建文件的文件描述符

off_t offset:对于下一个参数whence的偏移值,负值向左移动,正值向右移动,0从当前开始

int whence:光标出现位置,分别有以下几种:

SEEK_SET文件头
SEEK_CUR文件当前位置
SEEK_END文件尾

示例如下:

lseek(fd,0,SEEK_SET);//光标移动到文件头
lseek(fd,0,SEEK_CUR);//光标保留当前位置
lseek(fd,0,SEEK_END);//光标移动到文件尾lseek(fd,1,SEEK_SET);//光标相对于文件头向右移动1个字节
lseek(fd,1,SEEK_CUR);//光标相对当前位置向右移动1个字节
lseek(fd,-1,SEEK_END);//光标相对于文件尾向左移动1个字节

函数返回值

移动成功后该函数的返回值是光标针对于文件头移动的字节数,可以利用该函数计算文件字节大小

示例如下:

int file1_size = lseek(fd_file1,0,SEEK_END);//光标移动到文件尾并将移动字节数返回
printf("write file1 size = %d\n",file1_size);

代码展示(对上节做出调整)

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>int main()
{int fd;char *buf = "Hello Word";fd = open("./file1",O_RDWR);//文件删除,文件描述符返回值为-1if(fd == -1){printf("open file1 failed\n");fd = open("./file1",O_RDWR|O_CREAT,0600);//重新建立一个file1,此时文件描述符返回值大于0if(fd > 0){printf("creat file1 success\n");}}printf("open success:fd = %d\n",fd);int n_write = write(fd,buf,strlen(buf));//定义一个整型变量存放write返回的文件描述符的值(写入字节个数)if(n_write != -1){printf("write %d byte to file1\n",n_write);}lseek(fd,0,SEEK_SET);//将光标移动到文件头
//	lseek(fd,-n_write,SEEK_CUR);//光标相对于当前位置移动向左移动写入字节个数char *readBuf;readBuf = (char *)malloc(sizeof(char)*n_write+1);//对指针进行开辟内存空间,其读取的字节数为写入的字节数,其大小为char型,可用写入字节个数乘以char的值即为读取个数,此时存放的是字符串int n_read = read(fd,readBuf,n_write);//定义一个整型变量存放read返回的文件描述符的值(读取字节个数)printf("read byte is %d,context is %s\n",n_read,readBuf);close(fd);return 0;
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 前端设计模式之【访问者模式】
  • 计算机视觉与深度学习 | 改进的SIFT立体匹配算法
  • IP行业API助力于网络分析和数据挖掘
  • centos安装docker和docker-compose
  • 华为eNSP实验-QinQ基本实验
  • 【OpenHarmony内核】Harmony内核之线程操作函数(二)
  • sql语句-实体属性有集合怎么批量查询
  • react 修改less文件后保存,内存溢出,项目崩溃问题解决
  • 解锁潜在商机的钥匙——客户管理系统公海池
  • maven打包可运行jar
  • 计算机视觉与深度学习 | 视频/图像转换及保存播放(Matlab源码)
  • 基于arm-gcc 工具链开发mcu程序时,怎么便捷查看内存映像
  • selenium headless 无头模式慢
  • SpringBoot3+Vue3+Mysql+Element Plus完成数据库存储blob类型图片,前端渲染后端传来的base64类型图片
  • CSS 的 link 标签放在 head 标签之间的作用
  • [Vue CLI 3] 配置解析之 css.extract
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • 【React系列】如何构建React应用程序
  • Django 博客开发教程 16 - 统计文章阅读量
  • Invalidate和postInvalidate的区别
  • JavaScript函数式编程(一)
  • java多线程
  • js学习笔记
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • PHP变量
  • React as a UI Runtime(五、列表)
  • 阿里云ubuntu14.04 Nginx反向代理Nodejs
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 提醒我喝水chrome插件开发指南
  • 听说你叫Java(二)–Servlet请求
  • 中文输入法与React文本输入框的问题与解决方案
  • kubernetes资源对象--ingress
  • ​油烟净化器电源安全,保障健康餐饮生活
  • #stm32驱动外设模块总结w5500模块
  • (2024最新)CentOS 7上在线安装MySQL 5.7|喂饭级教程
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (二)pulsar安装在独立的docker中,python测试
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • (一)WLAN定义和基本架构转
  • (轉貼)《OOD启思录》:61条面向对象设计的经验原则 (OO)
  • .NET CORE 3.1 集成JWT鉴权和授权2
  • .NET Framework 服务实现监控可观测性最佳实践
  • .NET/C# 解压 Zip 文件时出现异常:System.IO.InvalidDataException: 找不到中央目录结尾记录。
  • .NET中的十进制浮点类型,徐汇区网站设计
  • .net中应用SQL缓存(实例使用)
  • /etc/fstab 只读无法修改的解决办法
  • @JsonSerialize注解的使用
  • @RequestParam,@RequestBody和@PathVariable 区别
  • [ vulhub漏洞复现篇 ] struts2远程代码执行漏洞 S2-005 (CVE-2010-1870)
  • [2019.2.28]BZOJ4033 [HAOI2015]树上染色
  • [Bada开发]初步入口函数介绍
  • [C/C++随笔] char与unsigned char区别