main函数传参
//argc:计算形参的个数
//char * argv[]:指针数组:里面存放了多个指针变量,每个指针可以指向一个字符串
int main(int argc, char * argv[])
{
if(argc != 3)
{
printf("指令有误,请重新输入!\n");
return -1;
}
printf("把%s拷贝到%s里面\n",argv[1],argv[2]);
return 0;
}
练习:
#include
#include
#include
#include
#include
#include
#include
#include
#define DATA_LEN 20 //拟定值
#define PATH_LEN 50
typedef struct file_inf
{
int file_a_fd;//文件描述符
int file_b_fd;
int cp_data_size;
int data_len;//数据长度 --- 每次读取的数据的字节数
char *file_a_path;//存放文件对应的路径
char *file_b_path;
}FI,*P_FI;
/*函数申明*/
P_FI Copy_Init(int file_num,char * a_path,char * b_path);
int Copying(P_FI fi);
int Copy_Free(P_FI fi);
P_FI Copy_Init(int file_num,char * a_path,char * b_path)
{
if((file_num != 2) || (access(a_path,F_OK)))
{
printf("指令有误!异常退出\n");
return (P_FI)-1;
}
/*申请空间*/
P_FI fi = (P_FI)malloc(sizeof(FI));
memset(fi,0,sizeof(FI));//这个清空,把里面的两个指针变量存放的数据清空成0
fi->file_a_path = (char *)malloc(PATH_LEN);
fi->file_b_path = (char *)malloc(PATH_LEN);
if(fi == NULL || fi->file_a_path == NULL || fi->file_b_path == NULL)
{
perror("malloc");
return (P_FI)-1;
}
/*先清空*/
memset(fi->file_a_path,0,PATH_LEN);
memset(fi->file_b_path,0,PATH_LEN);
//保存路径
strcpy(fi->file_a_path,a_path);
strcpy(fi->file_b_path,b_path);
umask(0000);
fi->file_a_fd = open(fi->file_a_path,O_RDONLY);
fi->file_b_fd = open(fi->file_b_path,O_WRONLY | O_CREAT,0777);
if(fi->file_a_fd == -1 || fi->file_b_fd == -1)
{
perror("open");
return (P_FI)-1;
}
fi->data_len = DATA_LEN;
fi->cp_data_size = 0;
return fi;//结构体指针
}
int Copying(P_FI fi)
{
char TQ[DATA_LEN];
int read_ret,write_ret;
while(1)
{
memset(TQ,0,DATA_LEN);
read_ret = read(fi->file_a_fd,TQ,DATA_LEN);
if(read_ret == -1)
{
perror("read");
return -1;
}
else if(read_ret == 0)
{
break;
}
else
{
write_ret = write(fi->file_b_fd,TQ,read_ret);
if(write_ret == -1)
{
perror("write");
return -1;
}
else
{
fi->cp_data_size+=read_ret;
}
}
}
return 0;
}
int Copy_Free(P_FI fi)
{
int close_ret_1 = close(fi->file_a_fd);
int close_ret_2 = close(fi->file_b_fd);
if(close_ret_1 == -1 || close_ret_2 == -1)
{
perror("close");
return -1;
}
free(fi->file_a_path);
free(fi->file_b_path);
free(fi);
return 0;
}
int main(int argc,char ** argv)
{
P_FI fi = Copy_Init(argc-1,argv[1],argv[2]);
if(fi == (P_FI)-1)
{
printf("初始化失败!\n");
}
else
{
printf("初始化成功!\n");
printf("即将把%s的数据拷贝到%s里面\n",fi->file_a_path,fi->file_b_path);
}
int copying_ret = Copying(fi);
if(copying_ret == -1)
{
printf("拷贝失败!\n");
return -1;
}
else
{
printf("拷贝完成,共拷贝%d个字节!\n",fi->cp_data_size);
}
int copy_free_ret = Copy_Free(fi);
if(copy_free_ret == -1)
{
printf("释放拷贝资源失败!\n");
return -1;
}
else
{
printf("释放拷贝资源成功!\n");
}
return 0;
}