news 2026/9/21 17:42:00

IO相关函数多种类型的拷贝

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
IO相关函数多种类型的拷贝

一:将1.txt一半拷贝给2.txt,一半拷贝给3.txt 使用多个.c 使用makefile完成。

main.c

#include "fun.h"

int main(int argc, const char *argv[])

{

cope1();

return 0;

}

fan.c

#include "fun.h"

void cope1()

{

FILE *fp1=fopen("1.txt","r");

FILE *fp2=fopen("2.txt","w");

FILE *fp3=fopen("3.txt","w");

if(fp1==NULL)

{

perror("fopen");

return;

}

fseek(fp1,0,SEEK_END);

long fp1_leng=ftell(fp1);

fseek(fp1,0,SEEK_SET);

char *buff=malloc(fp1_leng);

fread(buff,fp1_leng/2,1,fp1);

fwrite(buff,fp1_leng/2,1,fp2);

fseek(fp1,-fp1_leng/2,SEEK_END);

fread(buff,fp1_leng/2,1,fp1);

fwrite(buff,fp1_leng/2,1,fp3);

fclose(fp1);

fclose(fp2);

fclose(fp3);

}

fun.h

#ifndef __uhbh__

#define __uhbh__

#include<myhead.h>

void cope1();

#endif

Makefile

myexe:*.c

gcc $^ -o $@

%.o:%.c

gcc -c $^ -o $@

.PHONY:clean

clean:

rm *.o myexe

二:使用read和write实现文件的拷贝

#include <myhead.h>

int main(int argc, const char *argv[])

{

int fd1=open("1.txt",O_RDONLY);

int fd2=open("2.txt",O_CREAT|O_WRONLY|O_TRUNC,0664);

int fd3=open("3.txt",O_CREAT|O_WRONLY|O_TRUNC,0664);

if(fd1==-1||fd2==-1||fd3==-1)

{

perror("open");

return -1;

}

int len=lseek(fd1,0,SEEK_END);

lseek(fd1,0,SEEK_SET);

char a[len/2];

read(fd1,a,sizeof(a));

write(fd2,a,sizeof(a));

char b[len-len/2];

lseek(fd1,0,len/2);

read(fd1,b,sizeof(b));

write(fd3,b,sizeof(b));

close(fd1);

close(fd2);

close(fd3);

printf("拷贝成功\n");

return 0;

}

三:创建子父进程,子进程拷贝文件的前一半,父进程拷贝后一半。 1、父进程中调用子函数算出源文件长度 2、子进程执行流调用copy函数,拷贝len/2字节 3、父进程执行流调用copy函数,拷贝len-len/2字节。

#include <myhead.h>

int length_file(const char *p1,const char *p2)

{

int fd1=open("p1",O_RDONLY);

int fd2=("p2",O_WRONLY|O_CREAT|O_TRUNC,0664);

if(fd1==-1||fd2==-1)

{

perror("open");

return -1;

}

int len=lseek(fd1,0,SEEK_END);

close(fd1);

close(fd2);

return len;

}

int copy_file(const char *p1,const char *p2,int start,int half)

{

int fd1=open("p1",O_RDONLY);

int fd2=("p2",O_WRONLY|O_CREAT|O_TRUNC,0664);

if(fd1==-1||fd2==-1)

{

perror("open");

return -1;

}

lseek(fd1,start,SEEK_SET);

lseek(fd2,start,SEEK_SET);

char buff[100];

int sum=0;

while(1)

{

int res=read(fd1,buff,sizeof(buff));

sum+=res;

if(sum>=half||res==0)

{

write(fd2,buff,(res-(sum-half)));

break;

}

write(fd2,buff,res);

}

close(fd1);

close(fd2);

return 0;

}

int main(int argc, const char *argv[])

{

int len=length_file(argv[1],argv[2]);

pid_t pid=fork();

if(pid==0)

{

copy_file(argv[1],argv[2],0,len/2);

}

else if(pid>0)

{

copy_file(argv[1],argv[2],len/2,len-len/2);

}

else

{

perror("fork");

return -1;

}

return 0;

}

四:创建3个进程,子进1程拷贝文件的前一半,子进程2拷贝后一半文件,父进程回收两个子进程资源。

#include <myhead.h>

int lengthfile(const char *p1,const char *p2)

{

int fd1=open(p1,O_RDONLY);

int fd2=open(p2,O_TRUNC|O_WRONLY|O_CREAT,0664);

if(fd1==-1||fd2==-1)

{

perror("open");

return -1;

}

int len=lseek(fd1,0,SEEK_END);

close(fd1);

close(fd2);

return len;

}

int copefile(const char *p1,const char *p2,int start,int len)

{

int fd1=open(p1,O_RDONLY);

int fd2=open(p2,O_WRONLY);

if(fd1==-1||fd2==-1)

{

perror("open");

return -1;

}

lseek(fd1,start,SEEK_SET);

lseek(fd2,start,SEEK_SET);

char buff[1024];

int sum=0;

while(1)

{

int res=read(fd1,buff,sizeof(buff));

sum+=res;

if(sum>len||res==0)

{

write(fd2,buff,res-(sum-len));

break;

}

write(fd2,buff,res);

}

close(fd1);

close(fd2);

}

int main(int argc, const char *argv[])

{

int pid;

int len=lengthfile("./1.txt","./2.txt");

pid=fork();

if(pid==0)

{

copefile("./1.txt","./2.txt",0,len/2);

sleep(10);

exit(0);

}

else if(pid>0)

{

int pid2=fork();

if(pid2==0)

{

copefile("./1.txt","./2.txt",len/2,len-len/2);

sleep(3);

exit(0);

}

else if(pid2>0)

{

int status;

wait(&status);

wait(&status);

printf("回收成功\n");

}

}

else

{

perror("fork");

return -1;

}

return 0;

}

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/22 1:17:24

如何快速解锁RouterOS无限权限:MikroTikPatch的终极指南

想要免费体验RouterOS的全部高级功能吗&#xff1f;MikroTikPatch项目为你提供了一套完整的RouterOS权限解锁解决方案&#xff0c;支持x86、ARM和MIPS多种硬件架构&#xff0c;让网络管理员能够轻松管理设备权限和功能扩展。这个开源工具通过智能化的密钥生成和系统补丁&#x…

作者头像 李华
网站建设 2026/9/22 2:06:11

测试工程师的增值型职业休假策略:从技术深耕到跨界突破

重新定义职业休憩期 2025年的科技行业正经历着人工智能与自动化测试的深度融合&#xff0c;传统测试岗位面临价值重构。在这样的背景下&#xff0c;职业休假&#xff08;Sabbatical&#xff09;不再是简单的休息间隔&#xff0c;而应成为测试工程师实现技术迭代、能力扩展和职…

作者头像 李华
网站建设 2026/9/21 18:01:21

USART串口

1.USART简介同步不常用&#xff0c;只支持时钟输出&#xff0c;不支持时钟输入&#xff0c;并不支持两个USART之间进行同步通信。波特率发生器&#xff1a;用来配置波特率&#xff0c;是一个分频器硬件流控制&#xff1a;可以防止数据处理过慢而导致的数据丢失的问题注意&#…

作者头像 李华
网站建设 2026/9/22 1:08:13

SDET职业生涯中的关键决策点与路径选择

在快速演进的软件开发生态系统中&#xff0c;SDET&#xff08;软件开发测试工程师&#xff09;的角色定位正在经历深刻变革。根据2024年行业调查数据显示&#xff0c;超过67%的资深测试工程师在职业发展中期面临路径选择困惑。本文通过剖析五个关键决策节点&#xff0c;为测试从…

作者头像 李华
网站建设 2026/9/21 13:50:49

第三方API密集型聚合服务的测试体系构建

测试范式转变的时代需求 随着微服务架构和API经济的蓬勃发展&#xff0c;现代软件系统越来越多地依赖于大量第三方API的集成与聚合。截至2025年&#xff0c;企业级应用平均接入的第三方API数量已超过40个&#xff0c;这种依赖关系为软件质量保障带来了前所未有的复杂性。作为测…

作者头像 李华
网站建设 2026/9/22 2:05:05

System Informer:你的Windows系统管家,3大核心功能深度解析

还在为Windows系统卡顿、资源占用高而烦恼吗&#xff1f;System Informer就是你的终极解决方案。这款免费开源的工具不仅能实时监控系统资源&#xff0c;还能深度调试软件进程&#xff0c;甚至具备强大的恶意软件检测能力&#xff0c;让你对电脑了如指掌。 【免费下载链接】sys…

作者头像 李华