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;
}