IO相关函数多种类型的拷贝
2026/6/14 14:58:04 网站建设 项目流程

一:将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;

}

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询