Linux文件操作的练习1(cp的实现)

jing## 1.实现cp指令:
首先要搞清楚的一点就是cp指令的使用方法:

cp demo1.c demo2.c  将demo1.c的内容拷贝到demo2.c中去

因此出现了一个问题就是,cp后面要紧跟着两个参数(原文件、新文件),我们该怎样实现这一功能。因此要引出main函数的参数,这个在windows下dev-c++中创建一个project的时候,其实默认给的main函数,就是带参数argc和argv的,让我们来写一个test1.c文件来看看这两个参数代表的是什么东西。

#include <stdio.h>

int main(int argc,char** argv){
	printf("The number of parents:%d\n",argc);
	printf("No.1 parent:%s\n",argv[0]);
	printf("No.2 parent:%s\n",argv[1]);
	printf("No.3 parent:%s\n",argv[2]);
	return 0;
}

运行结果如图所示:
在这里插入图片描述
很显然,main函数中argc代表的是参数的个数,二级指针argv是一个二维字符数组,存储的各个参数的名称,根据这一知识点我们就可以开始写我们自己的mycp了。

我的代码:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc,char** argv){
	int fdSrc,fdDes;
	if(argc < 3){
	//这里这个雄壮性是借鉴老陈的
		printf("The number of argc is wrong!\n");
		exit(0);
	}
	fdSrc = open(argv[1],O_RDONLY);
	if(fdSrc == -1){
		fd = open(argv[1],O_RDWR|O_CREAT,0600);
	}
	char Rbuf[1024];
	//设置一个可以读1M的缓存区
	int Rtypes = read(fdSrc,Rbuf,1024);
	fdDes = open(argv[2],O_WRONLY);
	if(fdDes == -1){
		fdDes = open(argv[2],O_RDWR|O_CREAT,0600);
	}
	int Wtypes = write(fdDes,Rbuf,strlen(Rbuf));
	close(fdSrc);
	close(fdDes);
	return 0;
}

运行结果却出现了点小问题,这个第二行开始有乱码:
但是
其实解决方法很简单,只需要将 Rbuf 初始化全部为{‘\0’}就好,而且这个代码在“粘贴”的这个过程中,如果字节数不够1M,不仅浪费时间,还浪费空间;而且还存在了一个bug就是,write只能去覆盖,所以复制之后的文件可能会有错误,所以通过听完老陈的讲解,我给他优化了一下:

优化后的代码:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc,char** argv){
	int fdSrc,fdDes;
	if(argc < 3){
		printf("The number of argc is wrong!\n");
		exit(0);
	}
	fdSrc = open(argv[1],O_RDONLY);
	//=================================================
	int size = lseek(fdSrc,0,SEEK_END)				//|
	lseek(fdSrc,0,SEEK_SET);						//|
	//这步必须有,否则指针在文本尾部,什么也读不到了   //|
	//=================================================
	if(fd == -1){
		fdSrc = open(argv[1],O_RDWR|O_CREAT,0600);
	}
	//=================================================
	char* Rbuf;										//|
	Rbuf = (char*)malloc(size * sizeof(char) + 1)	//|
	//=================================================
	int Rtypes = read(fdSrc,Rbuf,size);				//|
	fdDes = open(argv[2],O_WRONLY);
	if(fdDes == -1){
		fdDes = open(argv[2],O_RDWR|O_CREAT|O_TRUNC,0600);
		//记住这个O_TRUNC:如果新文本有内容,就全部去掉
	}
	int Wtypes = write(fdDes,Rbuf,strlen(Rbuf));
	close(fdSrc);
	close(fdDes);
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值