【Linux之IO系统编程学习】03.read函数+write函数实现cp命令效果

 
【Linux之IO系统编程学习】

项目代码获取:https://gitee.com/chenshao777/linux_-io.git
(麻烦点个免费的Star哦,您的Star就是我的写作动力!)

03.read函数+write函数实现cp命令效果

read与write函数的使用见我上一篇博客
https://blog.csdn.net/HuangChen666/article/details/130778392?spm=1001.2014.3001.5502

目录
       一、实验分析
       二、实验步骤
       三、代码
       四、实验结果

一、实验分析

cp函数的简单操作方法
如下操作所示,cp可以实现将a.txt的内容复制到另一个文件中,且如果该文件之前不存在,则会自动新建
如果该文件存在,则会清空该文件再复制全部内容到该文件

hc@hc-vm:~/Linux_ARM/git/linux_-io/02.write和read函数$ ls
02.cp.c  02.write_read.c  a.txt  cp
hc@hc-vm:~/Linux_ARM/git/linux_-io/02.write和read函数$ cp a.txt b.txt
hc@hc-vm:~/Linux_ARM/git/linux_-io/02.write和read函数$ ls
02.cp.c  02.write_read.c  a.txt  b.txt  cp
hc@hc-vm:~/Linux_ARM/git/linux_-io/02.write和read函数$ cat a.txt 
1234
hc@hc-vm:~/Linux_ARM/git/linux_-io/02.write和read函数$ cat b.txt 
1234
hc@hc-vm:~/Linux_ARM/git/linux_-io/02.write和read函数$ echo "abcd" > a.txt 
hc@hc-vm:~/Linux_ARM/git/linux_-io/02.write和read函数$ cat a.txt 
abcd
hc@hc-vm:~/Linux_ARM/git/linux_-io/02.write和read函数$ cp a.txt b.txt
hc@hc-vm:~/Linux_ARM/git/linux_-io/02.write和read函数$ cat b.txt 
abcd

二、实验步骤

  1. 新建一个a.txt,并且写入一些数据
  2. 代码中,先以只读方式打开源文件,再以清空+只写方式打开目标文件(源文件和目标文件均通过main函数的参数argv得到)
  3. 如果目标文件不存在,则以只写权限新建目标文件,并赋予0777权限
  4. 循环读取源文件数据到读取缓冲区,按照读取到的字节数将读取缓冲区内的数据写入目标文件
  5. 当读取字节数小于传入读取字节参数时退出循环
  6. 退出后再写入一次数据到目标文件
  7. 关闭两个文件的文件描述符

三、代码

#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#include <string.h>

/*模拟cp命令,拷贝文件内容到另一个文件*/
int main(int argc, char *argv[])
{
    /* 文件描述符 */
    int wr_fd, re_fd;      
    /* 读取文件成功字节数 */
    int re_count;
    /* 读取缓冲区 */
    char read_buff[128];

    /* 判断输入参数个数是否正确 */
    if(argc < 3){
        printf("输入的参数不够\n");
        return 0;
    }

    /* 以只读方式打开源文件 */
    re_fd = open(argv[1], O_RDONLY);
    if(re_fd > 0){
        printf("源文件打开成功, re_fd = %d\n",re_fd);
    }else{
        printf("源文件打开失败, re_fd = %d\n",re_fd);
        return 0;
    }

    /* 以只写方式打开目标文件,并且清空文件 */
    wr_fd = open(argv[2], O_TRUNC | O_WRONLY);
    if(wr_fd > 0){
        printf("目标文件打开成功, wr_fd = %d\n",wr_fd);
    }else{
        printf("目标文件打开失败, wr_fd = %d\n",wr_fd);
        /* 如果打开失败,则新建文件 */
        wr_fd = open(argv[2], O_CREAT | O_WRONLY, 0777);
    }

    for(;;){
        /* 循环读取文件 */
        re_count = read(re_fd, read_buff, sizeof(read_buff));
        /* 如果读取数据不够read_buff的大小,则退出 */
        if(re_count < sizeof(read_buff)){
            break;
        }else{
            /* 读写指针位置定位到文件最后 */
            lseek(wr_fd, 0, SEEK_END);
            /* 数据写入目标文件 */
            write(wr_fd, read_buff, re_count);
            /* 清空读取缓冲区 */
            memset(read_buff, 0, sizeof(read_buff));
        }
    }
    /* 读写指针位置定位到文件最后 */
    lseek(wr_fd, 0, SEEK_END);
    /* 数据写入目标文件 */
    write(wr_fd, read_buff, re_count);
    printf("文件拷贝成功!\n");
    close(re_fd);
    close(wr_fd);
    return 0;
}

代码中注释比较清晰了已经,不做过多解释,主要是要注意每次写入源文件之前要将文件读写指针定位到文件最后

/* 读写指针位置定位到文件最后 */
lseek(wr_fd, 0, SEEK_END);

四、实验结果

hc@hc-vm:~/Linux_ARM/git/linux_-io/02.write和read函数$ gcc 02.cp.c -o cp
hc@hc-vm:~/Linux_ARM/git/linux_-io/02.write和read函数$ cat a.txt 
1111
hc@hc-vm:~/Linux_ARM/git/linux_-io/02.write和read函数$ ls
02.cp.c  02.write_read.c  a.txt  cp
hc@hc-vm:~/Linux_ARM/git/linux_-io/02.write和read函数$ ./cp a.txt b.txt
源文件打开成功, re_fd = 3
目标文件打开失败, wr_fd = -1
文件拷贝成功!
hc@hc-vm:~/Linux_ARM/git/linux_-io/02.write和read函数$ cat b.txt 
1111
hc@hc-vm:~/Linux_ARM/git/linux_-io/02.write和read函数$ echo "abcdefg" > a.txt
hc@hc-vm:~/Linux_ARM/git/linux_-io/02.write和read函数$ cat a.txt 
abcdefg
hc@hc-vm:~/Linux_ARM/git/linux_-io/02.write和read函数$ ./cp a.txt b.txt
源文件打开成功, re_fd = 3
目标文件打开成功, wr_fd = 4
文件拷贝成功!
hc@hc-vm:~/Linux_ARM/git/linux_-io/02.write和read函数$ cat b.txt 
abcdefg
hc@hc-vm:~/Linux_ARM/git/linux_-io/02.write和read函数$ 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/22369.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

DOUBLETROUBLE 1

文章目录 DOUBLETROUBLE: 1实战演练一、前期准备1、相关信息 二、信息收集1、nmap探测目标靶机端口2、扫描目标网址目录3、访问网站&#xff0c;发现secret下有个图片4、将图片下载5、查看图片所含内容6、破解密码并查看7、登陆邮箱8、创建反弹shell9、上传反弹shell10、监听11…

失业五个月,终于有offer了!但这家公司的风评惨不忍睹,要接吗?

往年&#xff0c;程序员们找工作可以说是不怎么费力的&#xff0c;不少求职者还会比对几家offer&#xff0c;看薪酬、看加不加班、看通勤时间等等等等&#xff0c;最后选择自己最满意的那一家过去。 但是今年&#xff0c;情况确实完全不一样&#xff0c;用网友的话形容就是“往…

不同厂家对讲机耳塞耳挂/领夹型988对讲机如何写频改频点/频率能互相通信

988型号都是很多厂家代工出来的,代工出来默认的频点都不一样,有可能买回来的2个不同厂家生产的对讲机,这样它们要能通讯,必须要同频点才能互通,它一般出厂设定16个频道,长按+和-键来切换频道。 需要用到typeC 的写频线,其实是用CH430芯片的usb写频线,可以找厂家要写频线…

文件上传之,waf绕过(24)

上传参数名解析&#xff1a;明确哪些东西可以修改 content-disposition:一般可更改 表单的数据 name:表单参数值&#xff0c;不能更改 表单提交的值 filename&#xff1a;文件名&#xff0c;可以修改 上传的文件名 content-type&#xff1a;文件mime&#xff0c;…

数据库索引结构(1)概念

常见的索引 主键和二级索引 MySQL学习笔记-主键索引和二级索引_mysql中主键索引和二级索引的区别_爱因诗贤的博客-CSDN博客 MYSQL-主键索引与二级索引_mysql二级索引存在哪个文件_青苔小榭的博客-CSDN博客 采用主键索引的好处&#xff1a;如果元素的位置发生修改&#xff0c;那…

【随笔记】全志 T507 PF4 引脚无法被正常设置为中断模式的问题分析

相关信息 硬件平台&#xff1a;全志T507 系统版本&#xff1a;Android 10 / Linux 4.9.170 问题描述&#xff1a;PF4 无法通过标准接口设置为中断模式&#xff0c;而 PF1、PF2、PF3、PF5 正常可用。 分析过程 一开始以为是引脚被其它驱动占用引起&#xff0c;或者该引脚不具…

Mybatis中处理特殊SQL处理逻辑

文章目录 0、前言1、模糊查询2、动态表名3、获取自增的组件4、批量删除 0、前言 在MyBatis中可能会有一些特殊的SQL需要去执行&#xff0c;一般就是模糊查询、批量删除、动态设置表名、添加功能获取自增的主键这几种&#xff0c;现在分别来进行说明。 为了方便演示 &#xff0…

OA管理痛点解决:从“硬编码”到“低代码”

低代码开发平台是一种逐渐流行起来的软件开发方式&#xff0c;它可以以快速且简单的方式构建各种应用程序&#xff0c;从而帮助企业快速响应市场变化和满足不断变化的业务需求。在企业的日常管理工作中&#xff0c;OA系统是一种非常常见的应用程序&#xff0c;它可以帮助企业管…

C++每日一练:饿龙咆哮-逃离城堡(避坑指南)非负整数求和

文章目录 前言一、题目二、解题代码及思路1、思路2、代码 三、非负整数求和总结 前言 饿龙这一题要说难度嘛&#xff0c;还真是挺简单的&#xff0c;但要满分也是有坑的&#xff01;本文就记录了笔者解题过程&#xff0c;希望能对读者使用C编程有所启发。至于非负整数求和代码…

redis高级篇三(分片集群)

一)进行测试Sentinel池: 集群的定义:所谓的集群&#xff0c;就是通过增加服务器的数量&#xff0c;提供相同的服务&#xff0c;从而让服务器达到一个稳定、高效的状态 之前的哨兵模式是存在着一些问题的&#xff0c;因为如果主节点挂了&#xff0c;那么sentinel集群会选举新的s…

斯坦福、Nautilus Chain等联合主办的 Hackathon 活动,现已接受报名

由 Stanford Blockchain Accelerator、Zebec Protocol、 Nautilus Chain、Rootz Lab 共同主办的黑客松活动&#xff0c;现已接受优秀项目提交参赛申请。 在加密行业发展早期&#xff0c;密码极客们就始终在对区块链世界基础设施&#xff0c;在发展方向的无限可能性进行探索。而…

如何用Python进行屏幕录制?

文章目录 引言gpt3.5给出的代码更换截图函数——ImageGrab.grab禁用imshow解决递归现象摄像头录制代码后期需求 引言 关于屏幕录制这个功能需求&#xff0c;之前用过基于ffmpeg的Capture录屏软件&#xff0c;但是fps拉高以后会变得很卡&#xff0c;声音也同样出现卡顿。也自己…

nodej+vues汽车销售4s店服务平台商城系统购物车积分兑换7z9d2

在经济快速发展的带动下&#xff0c;汽车服务平台的发展也是越来越快速。用户对汽车服务信息的获取需求很大。在互联网飞速发展的今天&#xff0c;制作一个汽车服务平台系统是非常必要的。本系统是借鉴其他人的开发基础上&#xff0c;用MySQL数据库和nodejs定制了汽车服务平台系…

【MySQL】事务

事务是一组操作的集合,我们将一组操作视为一个整体,所以事务里面的操作的时候要么同时成功,要么同时失败,之所以会有事务也是因为我们在实际生活中会用到 最典型的例子就是转账操作:A向B进行转账,A这边扣款成功的同时B那边一定是收款成功的,如果没有事务的话就会出现A扣款成功但…

LMS,RGB,XYZ色彩空间转换

前言 首先需要指明本文中描述的R,G,B并非通常的sRGB中的三个分量R,G,B&#xff0c;而是波长分别为700nm&#xff0c;546.1nm&#xff0c;435.8nm的单色红光&#xff0c;单色绿光&#xff0c;单色蓝光。sRGB中的RGB中的红色、绿色、蓝色已经不是单色光了。虽然习惯上大家都叫RGB…

网络安全里的主要岗位有哪些?小白如何快速入门?

入门Web安全、安卓安全、二进制安全、工控安全还是智能硬件安全等等&#xff0c;每个不同的领域要掌握的技能也不同。 当然入门Web安全相对难度较低&#xff0c;也是很多人的首选。主要还是看自己的兴趣方向吧。 本文就以下几个问题来说明网络安全大致学习过程&#x1f447; 网…

SpringCloud微服务调用方式(RestTemplate)

服务调用方式 RPC和HTTP 无论是微服务还是SOA&#xff0c;都面临着服务间的远程调用。那么服务间的远程调用方式有哪些呢&#xff1f; 常见的远程调用方式有以下2种&#xff1a; RPC&#xff1a;Remote Produce Call远程过程调用&#xff0c;类似的还有 。自定义数据格式&am…

learn C++ NO.4 ——类和对象(2)

1.类的6个默认成员函数 1.1.默认成员函数的概念 在 C 中&#xff0c;如果没有显式定义类的构造函数、析构函数、拷贝构造函数和赋值运算符重载函数&#xff0c;编译器会自动生成这些函数&#xff0c;这些函数被称为默认成员函数。 class Date { };初步了解了默认成员函数&am…

STL-常用算法(二.拷贝 替换 算术 集合)

开篇先附上STL-常用算法(一)的链接 STL-常用算法&#xff08;一.遍历 查找 排序&#xff09;_小梁今天敲代码了吗的博客-CSDN博客 目录 常用拷贝和替换算法&#xff1a; copy函数示例&#xff1a;&#xff08;将v1容器中的元素复制给v2&#xff09; replace函数示例&#…

Java 9 - 18 各个版本新特性总结

【 Java 9 - 18 各个版本新特性总结&#xff0c;B站视频介绍】https://www.bilibili.com/video/BV1PT411P7Wn?vd_source5a3a58ca0e99223ffb58cddf2f3a7282 一、模块化引入 模块是 Java 9 中新增的一个组件&#xff0c;可以简单理解为是package的上级容器&#xff0c;是多个pa…