news 2026/5/30 17:47:37

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/29 20:56:40

自由职业与咨询:测试工程师的另一种活法

在数字经济的浪潮中&#xff0c;软件测试工程师的角色正从传统的全职雇佣模式&#xff0c;向更灵活的自由职业与咨询路径扩展。随着人工智能、云计算和敏捷开发的普及&#xff0c;测试行业对专业化、独立服务的需求日益增长。本文基于2025年的行业现状&#xff0c;探讨测试工程…

作者头像 李华
网站建设 2026/5/30 9:05:08

告别手动更新烦恼:Latest让你的macOS应用始终保持最新状态

告别手动更新烦恼&#xff1a;Latest让你的macOS应用始终保持最新状态 【免费下载链接】Latest A small utility app for macOS that makes sure you know about all the latest updates to the apps you use. 项目地址: https://gitcode.com/gh_mirrors/la/Latest 你是…

作者头像 李华
网站建设 2026/5/29 20:24:15

谈判技巧:在offer阶段如何为自己争取更好的薪酬包?

软件测试从业者的薪酬谈判机遇与挑战 在2025年底的软件测试行业中&#xff0c;随着人工智能和自动化测试工具的普及&#xff0c;企业对高素质测试人才的需求持续增长&#xff0c;这为从业者争取更优薪酬包创造了有利条件。然而&#xff0c;许多测试工程师在offer阶段因缺乏谈判…

作者头像 李华
网站建设 2026/5/29 19:32:13

Open-XiaoAI:如何让小爱音箱真正听懂你的声音,解锁无限可能

Open-XiaoAI&#xff1a;如何让小爱音箱真正听懂你的声音&#xff0c;解锁无限可能 【免费下载链接】open-xiaoai 让小爱音箱「听见你的声音」&#xff0c;解锁无限可能。 项目地址: https://gitcode.com/gh_mirrors/op/open-xiaoai 在智能音箱普及的今天&#xff0c;你…

作者头像 李华
网站建设 2026/5/29 19:51:59

在线字体编辑器终极指南:轻松编辑转换字体文件

在数字化设计时代&#xff0c;字体已成为提升作品质量的关键元素。在线字体编辑器让每个人都能轻松编辑、转换和优化字体文件&#xff0c;无需安装复杂软件。fonteditor作为一款功能全面的开源工具&#xff0c;支持TTF、WOFF、WOFF2、OTF、SVG、EOT等多种格式&#xff0c;让字体…

作者头像 李华
网站建设 2026/5/29 20:08:11

cmus音效终极优化指南:均衡器与重放增益完美配置

cmus音效终极优化指南&#xff1a;均衡器与重放增益完美配置 【免费下载链接】cmus Small, fast and powerful console music player for Unix-like operating systems. 项目地址: https://gitcode.com/gh_mirrors/cm/cmus cmus作为一款强大的控制台音乐播放器&#xff…

作者头像 李华