Linux 系统调用IO口,利用光标偏移实现文件复制
用系统调用IO函数实现从一个文件读取最后2KB数据并复制到另一个文件中,源文件以只读方式打开,目标文件以只写的方式打开,若目标文件不存在,可以创建并设置初始值为0664,写出相应代码,要对出错情况有一定的处理,并能够让用户自行输入要复制的文件名。
IO口即指Input和Outpot,常用的IO函数open() , close() , read() , write() ,lseek()。本节也围绕以上函数完成。
题目分析:
本质:从一个文件读取,然后写到另一个文件里。
添加形容:
源文件(要读取的文件),目标文件(要写入的文件)
源文件以只读方式打开:from_writed=open(argv[1],O_RDONLY);
目标文件以只写方式打开:to_readed=open(argv[2],O_WRONLY);
若目标文件不存在可以创建并设置初始值为0664:to_readed=open(argv[2],O_WRONLY|O_CREAT|O_TRUNC,0664);
命令简介:
O_RDONLY --以只读命令打开文件
O_WRONLY--以只写命令打开文件
O_WRONLY--以读写命令打开文件
O_CREAT--若文件不存在则创建
O_TRUNC--若文件存在则清除原有数据
最后一个参数mode 是文件权限,0代表没有权限,1代表可执行权限,2代表可写权限,4代表可读权限,将其相加可得0~7的八进制数。
0664表示的是 文件所有者可读可写,和文件所有者同组用户可读可写,其他用户可读。
对出错情况有一定的处理:
if(xx<0){printf("can't open %s",argv[x]);return-1}或者if(xx<0)
{perror("xx");}
(要使用perror(),前提引用库函数 #include<error.h>
让用户自行输入要复制的文件名:
这里主函数里写入参数
int main(int argc, char *argv[])
argc用来传参,此篇argc一共有三个参数,除了程序名还有两个,分别是源文件和目标文件(“要被复制的文件”和“要复制到的文件”),基于此实现用户自行输入要复制的文件名。
读取源文件最后2kb的数据:
用lseek()函数实现
int len;len=lseek(from_writed,-70,SEEK_END);
题目要求是最后2kb,但是2048太大了,我写的文件比较小,我就偏移个最后70,刚好是我文件最后一句话。
大家自己看,想偏多少都行。
函数原型
off_t lseek(int fd , off_t offset, int whence)
先来说一下这个off_t类型吧,它用于指示文件的偏移量。你可以就简单的理解为这是一个64位的整形数,相当于long long int,其定义在unistd.h头文件中可以查看。
参数:fd //文件描述符,可以通过open函数得到,通过这个fd可以操作某个文件
参数: offset //文件偏移量,是一个整形数
参数:whence //偏移类型,下列三个值中选一个。offset:
offset > 0 向后偏移
offset < 0 向前偏移
whence :
SEEK_SET:从文件头开始偏移
SEEK_CUR:从当前位置开始偏移
SEEK_END:从文件尾开始偏移
在使用这个函数之前,我们需要往C/C++文件中导入这些头文件:
#include <sys/types.h>
#include <unistd.h>
到此题目就分析完了。
写代码
先创个源文件
vi LLL
IO实现文件全部复制
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <error.h>
int main(int argc, char *argv[])
{if(argc != 3){printf("Input error\n");exit(1);}int fp_from = open(argv[1], O_RDONLY);//只读if(fp_from==-1){printf("open %s error\n",argv[1]);exit(2);}int fp_to = open(argv[2], O_WRONLY | O_CREAT, 0644);//读写,不存在则创建if(fp_to==-1){printf("open %s error\n",argv[2]);exit(3);}int buf[1024] = {0};ssize_t ret;while(1){ret = read(fp_from,buf,sizeof(buf) - 1);//从源文件读if(ret == -1){perror("read");}else if(ret == 0){printf("拷贝完毕\n");break;}ret == write(fp_to,buf,ret); //向目标文件写if(ret == -1){perror("write");}}close(fp_from);close(fp_to);return 0;
}
运行结果:
利用光标偏移,IO实现文件部分复制
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
int main(int argc,char **argv)
{ int from_writed; //源文件int to_readed; //目标文件int l_writed; //写入长度int l_readed; //读取长度int buf[2048];int len; //偏移长度if(argc != 3){printf("Input error\n");return -1;}from_writed=open(argv[1],O_RDONLY);//以只读方式打开源文件if(from_writed<=0){printf("can't oppen %s\n",argv[1]);return -1;}to_readed=open(argv[2],O_WRONLY);//以只写方式打开目标文件if(to_readed<=0) //如果文件不存在{to_readed=open(argv[2],O_WRONLY|O_CREAT|O_TRUNC,0664);//读写方式|不存在则创建|存在则清除数据,权限0664if(to_readed<=0){printf("can't open %s\n",argv[2]);return -1;}}while(1){// off_t len;len=lseek(from_writed,-70,SEEK_END); //移动光标至文件末尾前70个数据if(len>0){printf("current off_t : %d\n",len);输出当前光标位置所在}l_readed=read(from_writed,buf,2048); //从源文件读取if(l_readed<0){printf("can't read from %s\n",argv[1]);return -1;}if(l_readed>0){l_writed=write(to_readed,buf,l_readed);//写入到目标文件if(l_writed>0){printf("拷贝完毕\n");break;}if(l_writed<0){printf("can't write to %s\n",argv[2]);return -1;}}elsebreak;}close(from_writed);close(to_readed);return 0;}
还利用上面那个LLL文件
运行:
查看:
刚好偏移最后一句话。
相关文章:

Linux 系统调用IO口,利用光标偏移实现文件复制
用系统调用IO函数实现从一个文件读取最后2KB数据并复制到另一个文件中,源文件以只读方式打开,目标文件以只写的方式打开,若目标文件不存在,可以创建并设置初始值为0664,写出相应代码,要对出错情况有一定的处…...
【原创】指针变量作为函数参数要点注意
指针变量作为函数参数要点注意(已写至笔记) 1传参指针不加*(main中函数) 2收参指针要加*(被main调用的函数) 3传参指针名可与收参指针名不同,不影响 4【问】如何看主函数中指针所指内容是否改变…...

SpringMVC Day 04 : 数据绑定
前言 SpringMVC是一个非常流行的Java Web框架,它提供了很多方便的功能和工具来帮助我们构建高效、灵活的Web应用程序。其中,数据绑定就是SpringMVC中非常重要的一部分,它可以帮助我们方便地将请求参数绑定到Java对象上,从而简化了…...
2.3.1 协程设计原理与汇编实现
1.为什么要有协程? 同步的编程方式,异步的性能。同步编程时,我们需要等待io就绪。但是在协程这里,我们使用一种机制,当io需要等待时,就切到下一个io,之后当之前的io就绪时,再切换回来…...

J2EE项目部署与发布(Windows版本)->会议OA单体项目Windows部署,spa前后端分离项目Windows部署
会议OA单体项目Windows部署spa前后端分离项目Windows部署 1.会议OA单体项目Windows部署(以实施的角度) 将项目放入webapp,项目能够访问: 首先拿到war包和数据库脚本,并检查是否有什么问题。 如何查看项目报错信息(当你…...

Lua脚本语言
1. 概念 Lua(发音为"loo-ah",葡萄牙语中的"lua"意为月亮)是一种轻量级的、高效的、可嵌入的脚本编程语言。官网Lua最初由巴西计算机科学家Roberto Ierusalimschy、Waldemar Celes和Luiz Henrique de Figueiredo于1993年开…...
cat()函数和print()函数的区别
目录 区别一: 区别二: cat、print函数都是输出函数。 区别一: cat()函数不能赋值; print()函数可以赋值。 x<-cat("hello world") //赋值 hello world x //cat函数无返回值 NULLy<-print("hello …...

宝塔面板安装Python和Flask(新版Python项目)
(一)宝塔面板的项目菜单,打开Python项目的“项目版本管理” 安装Python版本3.10.0。 会创建一个Python版本的文件夹www/server/pyproject_evn/versions/ 会创建一个Python虚拟环境的文件夹www/server/pyproject_evn/python_venv/ …...

火柴排队.
题意:给两列火柴,可以交换任意相邻的火柴,使得(ai-bi)^2的和最小,求最小交换次数。 分析:使得(ai-bi)^2的和最小,即a^2-2abb^2的和最小,那么使得2ab最大,就可…...

改善游戏体验:数据分析与可视化的威力
当今,电子游戏已经超越了娱乐,成为一种文化现象,汇聚了全球数十亿的玩家。游戏制作公司正采用越来越复杂的技术来提高游戏质量,同时游戏数据分析和可视化工具变得不可或缺。 数据的力量:解析游戏体验 游戏制作涉及到大…...
GEE:本地影像上传到GEE的Assets中,并输入机器学习算法中作为特征变量
作者:CSDN @ _养乐多_ 当我们在 Google Earth Engine(GEE)中应用机器学习算法时,会输入一些影像作为特征变量数据,进一步根据这些特征影像去推理未知区域的数据。但是 GEE 平台上计算特征变量的 API 函数并不是非常全面,我们希望获得更多的特征用于分类。这个时候,我们…...

【Mybatis源码】XMLConfigBuilder构建器 - 读取XML配置初始化Configuration对象
XMLConfigBuilder是Mybatis中定义的进行构建Configuration对象的类,此类用于读取XML配置文件创建并初始化Configuration对象; 上一篇中我们介绍了XMLConfigBuilder构建器加载XML配置文件以及创建Configuration对象https://blog.csdn.net/m1729339749/article/details/133983…...

Python算法练习 10.28
leetcode 700 二叉搜索树中的搜索 给定二叉搜索树(BST)的根节点 root 和一个整数值 val。 你需要在 BST 中找到节点值等于 val 的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 null 。 示例 1: 输入:root [4,2,7,1,…...

【java学习—八】单例设计模式(5)
文章目录 1. 相关概念2. 单例设计模式-饿汉式3. 单例设计模式-懒汉式4. 总结 1. 相关概念 单例:只有一个实例(实例化对象) 设计模式是在大量的实践中总结和理论化之后优选的代码结构、编程风格、以及解决问题的思考方式。设计模式就像是经典的…...

【设计模式】第4节:创建型模式之“单例模式”
一、介绍 采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法。 不使用单例模式的UML类图: 使用单例模式的UML类图: 使用场景: 需要频繁创建或销毁的对象…...

NodeJS爬取墨刀上的设计图片
背景 设计人员分享了一个墨刀的原型图,但是给的是只读权限,无法下载其中的素材;开发时想下载里面的一张动图,通过浏览器的F12工具在页面结构找到了图片地址。 但是浏览器直接访问后发现没权限: Nginx 的 403 页面。。…...

linux--
一、crond 任务调度 1、原理示意图 2、crontab 进行定时任务的设置 2.1. 概述 任务调度,是指系统在某个时间执行的特定的命令或程序。任务调度分类: 系统工作: 有些重要的工作必须周而复始地执行。如病毒扫描等 个别用户工作:个别用户可能希望执行某些…...

conda虚拟环境笔记收录
1、安装conda 增加执行权限: chmod x Anaconda3-2023.03-1-Linux-x86_64.sh 开始执行:./Anaconda3-2023.03-1-Linux-x86_64.sh2、查看版本 conda --version3、查看当前虚拟环境 虚拟环境和全局环境有前缀可见 如果不进行设置,重新启动就变成…...

RGB-T Salient Object Detection via Fusing Multi-Level CNN Features
ADFC means ‘adjacent-depth feature combination’,MGF means ‘multi-branch group fusion’,JCSA means ‘joint channel-spatial attention’,JABMP means ‘joint attention guided bi-directional message passing’ 作者未提供代…...

安卓开发实例:方向传感器
调用手机的方向传感器,X轴,Y轴,Z轴的数值 activity_sensor.xml <?xml version"1.0" encoding"utf-8"?> <androidx.constraintlayout.widget.ConstraintLayoutxmlns:android"http://schemas.android.c…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...

优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...

系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文通过代码驱动的方式,系统讲解PyTorch核心概念和实战技巧,涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...
JS红宝书笔记 - 3.3 变量
要定义变量,可以使用var操作符,后跟变量名 ES实现变量初始化,因此可以同时定义变量并设置它的值 使用var操作符定义的变量会成为包含它的函数的局部变量。 在函数内定义变量时省略var操作符,可以创建一个全局变量 如果需要定义…...

【iOS】 Block再学习
iOS Block再学习 文章目录 iOS Block再学习前言Block的三种类型__ NSGlobalBlock____ NSMallocBlock____ NSStackBlock__小结 Block底层分析Block的结构捕获自由变量捕获全局(静态)变量捕获静态变量__block修饰符forwarding指针 Block的copy时机block作为函数返回值将block赋给…...