main函数的参数:
#include <stdio.h>
int main(int argc,const char* argv[])
{}
作用:
是为了获取命令行附加的参数
- argc:命令行附加参数的个数
- argv[]:每个命令字符串的首地址
fopen实现cp命令
- vim cp.c 输入下面代码,保存退出。
- gcc cp.c -o cp 出现一个cp文件
- ./cp 路径1 路径2
- 例 ./cp 1.c 2.c
#include <stdio.h>
int main(int argc,const char* argv[])
{
//参数不是3个 报错
if(3 != argc)
{
printf("User:cp src dest\n");
return 0;
}
//路径1 路径2相同 无法复制
if(strcmp(argv[1],argv[2])==0)
{
printf("为同一文件 无法复制\n");
return 0;
}
//先看看路径1文件是否存在 不存在则错误
FILE* src = fopen(argv[1],"r");
if(NULL == src)
{
printf("源文件不存在,请检查\n");
return 0;
}
//在看看路径2文件是否存在
FILE* dest = fopen(argv[2],"r");
if(dest)//存在则选择是否覆盖
{
printf("目标文件已存在,是否覆盖(y/n)");
char cmd = getchar();
if('y' != cmd && 'Y' != cmd)//不覆盖则停止
{
printf("停止拷贝\n");
return 0;
}
dest = fopen(argv[2],"w");//覆盖则给写权限
}
else //否则创建写入
{
dest = fopen(argv[2],"w");
}
char buf[256] = {};//缓冲区
int ret = 0;
//二进制读写好处可以复制如何东西 图片视频等等
while(0 < (ret = fread(buf,1,sizeof(buf),src))) 缓存区有东西则 无东西则结束
{
fwrite(buf,1,ret,dest); //每次存入1个字节存入ret个次到dest文件
}
//关闭文件
fclose(src);
fclose(dest);
}
系统IO open实现cp指令
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <getch.h>
int main(int argc,const char* argv[])
{
if(argc!=3)
{
puts("参数数量不对");
return 0;
}
if(strcmp(argv[1],argv[2])==0)
{
puts("为同一文件");
return 0;
}
int frd=open(argv[1],O_RDONLY);
if(frd==-1)
{
puts("找不到目标文件");
return 0;
}
int fwd=open(argv[2],O_RDONLY);
if(fwd!=-1)
{
puts("是否覆盖y/n");
char ch=getch();
if(ch!='Y'||ch!='y')
{
puts("停止复制");
return 0;
}
}
fwd=open(argv[2],O_WRONLY|O_TRUNC|O_CREAT,0600);
char a[500];
int x;
while(0< (x=read(frd,a,500)) )
{
write(fwd,a,x);
}
close(fwd);
close(frd);
}
版权声明:本文为weixin_50901683原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。