八月十八日作业

#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;
	if((srcfp=fopen(argv[1],"r"))==NULL)
	{
		perror("srcfile open error");
		return -1;
	}

	//以只写的形式打开文件
	FILE *dstfp;
	if((dstfp=fopen(argv[2],"w"))==NULL)
	{
        perror("dstfile open error");
		return -1;
	}

	//求文件的大小
	fseek(srcfp,0,SEEK_END);
	int size=ftell(srcfp);

	//定义搬运工
	char buf[100];

	//开始创建进程
	pid_t pid;
	pid=fork();            //此时产生了子进程

	//无论是父进程还是子进程都会执行下面的语句
	if(pid>0)
	{
		printf("父进程\n");

		//将光标定位在开头
		fseek(srcfp,0,SEEK_SET);
		while(ftell(srcfp)<(size/2))
		{
			fgets(buf,sizeof(buf),srcfp);
			fputs(buf,dstfp);
		}
		fflush(dstfp);
		wait(NULL);			
	}
	else if(pid==0)
	{
		printf("子进程\n");

		//将光标定位在中间位置
		fseek(srcfp,size/2,SEEK_SET);
		while(1)
		{
			fgets(buf,sizeof(buf),srcfp);
			if(feof(srcfp))
			{
				break;
			}
			fputs(buf,dstfp);
		}
		exit(EXIT_SUCCESS); 
	}
	else
	{
		perror("fork error");
		return -1;
	}

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

	printf("拷贝成功\n");

	return 0;
}

#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;
	if((srcfp=fopen(argv[1],"r"))==NULL)
	{
		perror("srcfile open error");
		return -1;
	}

	//以只写的形式打开文件
	FILE *dstfp;
	if((dstfp=fopen(argv[2],"w"))==NULL)
	{
        perror("dstfile open error");
		return -1;
	}

	//求文件的大小
	fseek(srcfp,0,SEEK_END);
	int size=ftell(srcfp);

	//定义搬运工
	char buf[100];

	//开始创建进程
	pid_t pid1;
	pid1=fork();            //此时产生了子进程

	if(pid1>0)
	{
		pid_t pid2;
		pid2=fork();           //在子进程中再次创建进程

		if(pid2>0)
		{
		    //将光标定位在开头
		    fseek(srcfp,0,SEEK_SET);
		    while(ftell(srcfp)<(size/3))
		    {
			    fgets(buf,sizeof(buf),srcfp);
			    fputs(buf,dstfp);
		    }
		    fflush(dstfp);
		    wait(NULL);			
		    wait(NULL);	
		}
		else if(pid2==0)
		{
			//将光标定位在三分之一处
			fseek(srcfp,size/3,SEEK_SET);
			while(ftell(srcfp)<((size/3)*2))
			{
			fgets(buf,sizeof(buf),srcfp);
			fputs(buf,dstfp);
			}
			exit(EXIT_SUCCESS);
		}
		else
		{
			perror("fork error");
			return -1;
		}
	}
	else if(pid1==0)
	{
		//将光标定位在三分之二处
		fseek(srcfp,(size/3)*2,SEEK_SET);
		while(ftell(srcfp)<size)
		{
		    fgets(buf,sizeof(buf),srcfp);
	     	fputs(buf,dstfp);
		}
		exit(EXIT_SUCCESS);
	}
	else
	{
		perror("fork error");
		return -1;
	}

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

	printf("拷贝成功\n");

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值