news 2026/9/2 23:45:38

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/2 20:04:47

如何用3个核心模块构建Three.js手势交互系统:实战指南

如何用3个核心模块构建Three.js手势交互系统&#xff1a;实战指南 【免费下载链接】hammer.js 项目地址: https://gitcode.com/gh_mirrors/ham/hammer.js 你是否曾在3D网页应用中体验过卡顿的旋转操作&#xff1f;或者为缩放控制不够精准而烦恼&#xff1f;传统鼠标交互…

作者头像 李华
网站建设 2026/9/2 9:41:32

3步掌握JSMpeg播放器数据监控与性能优化实战指南

3步掌握JSMpeg播放器数据监控与性能优化实战指南 【免费下载链接】jsmpeg MPEG1 Video Decoder in JavaScript 项目地址: https://gitcode.com/gh_mirrors/js/jsmpeg 还在为视频播放卡顿问题头疼&#xff1f;想深入了解用户观看行为却无从下手&#xff1f;今天我们就一起…

作者头像 李华
网站建设 2026/9/2 10:20:55

Gesturefy:Firefox鼠标手势插件完全指南

Gesturefy&#xff1a;Firefox鼠标手势插件完全指南 【免费下载链接】Gesturefy Navigate, operate, and browse faster with mouse gestures! A customizable Firefox mouse gesture add-on with a variety of different commands. 项目地址: https://gitcode.com/gh_mirror…

作者头像 李华
网站建设 2026/9/2 1:35:53

千万不能错过!这款外卖点单小程序让商家效率飙升

千万不能错过&#xff01;这款外卖点单小程序让商家效率飙升引言随着移动互联网的快速发展&#xff0c;外卖行业已经成为餐饮业不可或缺的一部分。为了提升运营效率和服务质量&#xff0c;越来越多的商家开始采用外卖点单小程序。本文将深入探讨一款高效的外卖点单小程序——妙…

作者头像 李华
网站建设 2026/9/2 3:36:35

tev:终极HDR图像查看器与专业对比工具指南

tev&#xff1a;终极HDR图像查看器与专业对比工具指南 【免费下载链接】tev High dynamic range (HDR) image viewer for graphics people 项目地址: https://gitcode.com/gh_mirrors/te/tev 想要快速高效地查看和比较高动态范围图像吗&#xff1f;tev是一款专为图形专业…

作者头像 李华
网站建设 2026/9/2 19:50:43

Monstercat Visualizer终极指南:打造专属音乐可视化盛宴

还在为单调的音乐播放界面感到乏味吗&#xff1f;想要让每一首歌曲都拥有独特的视觉呈现吗&#xff1f;Monstercat Visualizer就是你的完美答案&#xff01;这款基于Rainmeter的实时音频可视化工具&#xff0c;能够将音乐转化为令人惊艳的动态视觉效果&#xff0c;让你的桌面变…

作者头像 李华