news 2026/5/12 2:45:23

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/5/11 3:14:59

智能合约的测试验证方法

智能合约是自动执行的数字协议&#xff0c;基于区块链技术实现&#xff0c;具有不可篡改和去中心化特点。然而&#xff0c;其一旦部署便难以修改的特性&#xff0c;使得测试验证成为确保安全性的关键环节。对于软件测试从业者而言&#xff0c;智能合约测试不仅涉及传统软件测试…

作者头像 李华
网站建设 2026/5/11 17:42:18

A/B测试的AI优化方案:从传统实验到智能决策的跨越

在数字化转型加速的2025年&#xff0c;A/B测试作为数据驱动决策的核心工具&#xff0c;正面临实验效率低下、结果解读片面、迭代周期过长等挑战。根据Gartner最新报告&#xff0c;超过67%的企业表示传统A/B测试方法已难以满足快速业务迭代需求。本文针对软件测试从业者群体&…

作者头像 李华
网站建设 2026/5/9 1:28:24

网易云音乐个人数据导出实战指南:从零掌握数据备份全流程

你是否曾担忧精心收藏的网易云音乐歌单会因账号异常而消失&#xff1f;那些陪伴你度过无数日夜的播放记录&#xff0c;是否也渴望被永久珍藏&#xff1f;今天&#xff0c;我将带你深入探索InfoSpider这一开源神器&#xff0c;让你在短短几分钟内完整备份所有音乐数据。 【免费下…

作者头像 李华
网站建设 2026/5/11 9:58:26

从“我被拒了”到“我学到了”——软件测试面试的精准复盘法则

直面失败&#xff1a;建立正确的复盘心态 面试失败本质上是一次压力测试数据收集。软件测试工程师最擅长的就是从失败案例中定位问题&#xff0c;这个职业素养完全可以迁移到面试复盘中。拒绝将结果归因于"运气不好"或"面试官苛刻"&#xff0c;而是像分析…

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

千人千面营销系统的全方位测试策略

系统架构分析与测试挑战 "千人千面"营销系统是基于用户画像、行为数据和实时计算引擎的个性化推荐体系。其核心架构通常包含&#xff1a; 数据采集层&#xff1a;用户点击流、交易数据、社交行为等多源数据采集 画像计算层&#xff1a;用户标签体系构建与实时更新机…

作者头像 李华