IO-day4

1、

#include <myhead.h>	
int main(int argc, const char *argv[])
{
	//判断传入文件个数
	if(argc != 3)
	{
		printf("intput file error\n");
		printf("usage:./a.out srcfile dstfile\n");
		return -1;
	}

	//定义两个文件
	FILE *srcfp, *dstfp;

	//以只读的形式打开第一个文件
	if((srcfp=fopen(argv[1],"r")) == NULL)
	{
		perror("fopen srcfile error");
		return -1;
	}

	//以只写的形式打开第二个文件
	if((srcfp=fopen(argv[2], "w")) == NULL)
	{
		perror("fopen dstfile error");
		return -1;
	}
	
	pid_t pid = fork();    //创建子进程

	//搬运数据
	char buf[128] = "";
	//文件总长度
	int len = fseek(srcfp, 0, SEEK_END);
	int l = len/2;

	if(pid > 0)
	{
		//父进程执行
		//光标位置不偏移
		fseek(srcfp, 0, SEEK_SET);

		//定义缓存区用来搬运数据
		int ret1 = 0;

		while((ret1=fread(buf, sizeof(buf), l, srcfp)) > 0)
		{
			//将数据写入第二个文件中
			fwrite(buf, ret1, l, dstfp);
		}
		printf("父进程拷贝成功\n");

		sleep(5);
		//阻塞等待回收子进程资源
		wait(NULL);

	}else if(pid == 0)
	{
		//子进程执行
		//光标偏移文件字节数一半
		fseek(srcfp, l, SEEK_SET);
		int ret2 = 0;

		while((ret2=fread(buf, sizeof(buf), len-l, srcfp)) > 0)
		{
			//将数据写入第二个文件中
			fwrite(buf, ret2, len-l, dstfp);
		}
		printf("子进程拷贝成功\n");

	}else
	{
		perror("fork error");
		return -1;
	}

	
	//关闭文件
	fclose(srcfp);
	fclose(dstfp);


	return 0;
}

结果为:

ubuntu@ubuntu:zy$ gcc 01kao.c 
ubuntu@ubuntu:zy$ ./a.out ./test1.c ./test11.txt 
父进程拷贝成功
子进程拷贝成功

2、

#include <myhead.h>	
int main(int argc, const char *argv[])
{
	//判断传入文件个数
	if(argc != 3)
	{
		printf("intput file error\n");
		printf("usage:./a.out srcfile dstfile\n");
		return -1;
	}

	//定义两个文件
	FILE *srcfp, *dstfp;

	//以只读的形式打开第一个文件
	if((srcfp=fopen(argv[1],"r")) == NULL)
	{
		perror("fopen srcfile error");
		return -1;
	}

	//以只写的形式打开第二个文件
	if((srcfp=fopen(argv[2], "w")) == NULL)
	{
		perror("fopen dstfile error");
		return -1;
	}
	
	pid_t pid = fork();    //创建子进程

	//文件总长度
	int len = fseek(srcfp, 0, SEEK_END);
	int l1 = len/3;
	int l2 = (len-l1)/2;
	int l3 = len-l1-l2;

	if(pid > 0)
	{
		//父进程执行
		//创建子进程2
		pid_t pid1 = fork();
		
		if(pid1 > 0)
		{
			//父进程拷贝
			//光标位置不偏移
			fseek(srcfp, 0, SEEK_SET);

			//搬运数据
			int buf[128];
			//定义缓存区用来搬运数据
			int ret1 = 0;
	
			while((ret1=fread(buf, sizeof(buf), l1, srcfp)) > 0)
			{
				//将数据写入第二个文件中
				fwrite(buf, ret1, l1, dstfp);
			}
			printf("父进程拷贝成功\n");
	
			sleep(5);
			//阻塞等待回收子进程资源
			wait(NULL);
		}else if(pid1 == 0)
		{
			//子进程2执行
			//光标位置偏移2/3
			fseek(srcfp, l1+l2, SEEK_SET);

			//搬运数据
			int buf[128];
			//定义缓存区用来搬运数据
			int ret = 0;
	
			while((ret=fread(buf, sizeof(buf), l3, srcfp)) > 0)
			{
				//将数据写入第二个文件中
				fwrite(buf, ret, l3, dstfp);
			}
			printf("子进程2拷贝成功\n");

		}

	}else if(pid == 0)
	{
		//子进程执行
		//光标偏移文件字节数1/3
		fseek(srcfp, l1, SEEK_SET);
		//搬运数据
		int buf[128];
		int ret = 0;

		while((ret=fread(buf, sizeof(buf), l2, srcfp)) > 0)
		{
			//将数据写入第二个文件中
			fwrite(buf, ret, l2, dstfp);
		}
		printf("子进程1拷贝成功\n");

	}else
	{
		perror("fork error");
		return -1;
	}

	
	//关闭文件
	fclose(srcfp);
	fclose(dstfp);


	return 0;
}

结果为:

ubuntu@ubuntu:zy$ gcc 02kao.c 
ubuntu@ubuntu:zy$ ./a.out ./test2.c ./test.txt 
父进程拷贝成功
子进程2拷贝成功
子进程1拷贝成功

3、思维导图

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值