Linux 实现文件后半部分的复制

继上次实现文件从后往前数2k的数据进行复制,此次要求是文件的一半且是后半部分。

即复制源文件sour_file的后半部分到dest_file

除了数据上从后2K变化到后一半之外,其他的几乎没有什么变化。

这道题的关键点就在于后一半怎么求,在经历了用 lseek(writed,0,SEEK_SET)求文件总长,用sizeof()函数求文件大小,strlen()函数求字符串长度等等等等N次尝试之后,意外发现了一种能达到效果且好用的方法:Struct stat 结构体。

如上图所示,struct stat 结构体内容是不需要自己写的,这算是自带属性。

这样一来就简单多了。

cs 复制代码
struct stat st;
//先把这个结构体拽出来
fstat(writed,&st);
//fstat函数的作用就是把得到的文件writed的属性给到结构体
int len=st.st_size;
//再调用得到其大小

如此就完整得到了源文件的大小。

我们只要后半部分,于是先取其一半

cs 复制代码
int filesize=len/2;

lseek(writed,filesize,SEEK_END);
//将光标从后往前移到文件二分之一处

或者从前往后移动二分之一也可以

cs 复制代码
lseek(writed,filesize,SEEK_SET);

然后从当前位置读取内容,写到目标文件就可以了

源码:

cs 复制代码
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<string.h>
int main(int argc,char *argv[])
{
        int writed; 
        int readed;
        int writed_len;
        int readed_len;
        int len_lseek;
        struct stat st;
        if(argc!=3)
        {
                printf("Input invaild\n");
                return -1;
        }

        writed=open(argv[1],O_RDONLY);\\只读打开
        if(writed<=0)
        {
                printf("Open Source File '%s' Failure",argv[1]);
                return -1;
        }

        readed=open(argv[2],O_WRONLY|O_CREAT|O_TRUNC,0664);
        if(readed<=0)
        {
                printf("Create Destination File '%s' Failure",argv[2]);
                return -1;
        }

        fstat(writed,&st);//将writed文件属性全部复制到结构体
        len_lseek=st.st_size; //利用stat结构体求得文件大小

        char buf[1024];

        lseek(writed,-len_lseek/2,SEEK_END);//将光标移动到文件1/2位置
        int count=0;
        while((readed_len=read(writed,buf,sizeof(buf)))!=0) //从源文件读取数据,直到全部读完
        {

                writed_len=write(readed,buf,readed_len);//将读取的内容写入到目标文件
                if(writed_len>0)
                {
                        printf("拷贝完成%d次\n",count+1);
                }
                if(writed_len<0)
                {
                        printf("Write Destination File '%s' Failure",argv[2]);
                }
        count++;
        }
        printf("The File has been copied and Executed %d times\n", count);


        close(writed);
        close(readed);
}



                                                             

网上随便复制了一段,放在了源文件里。

运行结果:

差不多是一半,我也没数,有强迫症可以数一数ヽ(゚∀゚)メ(゚∀゚)ノ ヾ(๑╹◡╹)ノ"ヾ(●´∀`●)

相关推荐
x138702859577 小时前
c语言中srtlen(指针使用计算字符长度)、传值和传址调用
c语言·开发语言·算法·visual studio
海兰7 小时前
【实用程序】电商销售分析仪表盘 — 从零搭建一个AI参与的全栈数据洞察系统
人工智能·学习·算法
凡人叶枫8 小时前
Effective C++ 条款28:避免使用 handles 指向对象内部
linux·服务器·开发语言·c++·嵌入式开发
AI帮小忙8 小时前
Debian系linux操作系统里安装OpenClaw
linux·运维·debian
极创信息8 小时前
Linux挖矿病毒深度清理实战教程,从进程隐藏、Rootkit驻留到彻底根除
java·大数据·linux·运维·安全·tomcat·健康医疗
zwenqiyu8 小时前
P5283 [十二省联考 2019] 异或粽子题解
c++·学习·算法
wayz118 小时前
Momentum:TSI(真实强度指数)技术指标详解
算法·金融·数据分析·量化交易·特征工程
万事大吉CC8 小时前
Python 笔试输入模板总结
python·算法
lihao lihao9 小时前
Linux信号
开发语言·c++·算法
大白话_NOI9 小时前
【洛谷 P2249】查找(深基 13. 例 1)+ 详细分析
c++·算法