关于main函数的参数 int main(int argc,const char* argv[])(cp指令的实现)

main函数的参数:

#include <stdio.h>
int main(int argc,const char* argv[])
{}

作用:

是为了获取命令行附加的参数

  1. argc:命令行附加参数的个数
  2. argv[]:每个命令字符串的首地址

fopen实现cp命令

  1. vim cp.c 输入下面代码,保存退出。
  2. gcc cp.c -o cp 出现一个cp文件
  3. ./cp 路径1 路径2
  4. 例 ./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版权协议,转载请附上原文出处链接和本声明。