cp scr.c des.c
1.c语言参数
#include <stdio.h>
int main(int argc,char **argv)
{
return 0;
}
int argc 表示命令行参数的个数(包括可执行程序名本身)。cp scr.c des.c 3个参数
char * argv [] 或char **argv表示每个参数的具体内容, argv [0] 为命令行中可执行程序名本身, argv [1] 为命令行中第二个参数的内容,依次类推。 如 前者可接受 命令行参数, argc 表示参数个数, argv []是参数数组,其中第0个参数是程序本身的名称(包含路径)。
2.思路:
a.打开scr.c文件
b.读取scr.c 到 buf
c.打开/创建des.c
d.将buf写入到des.c
e.close两个文件
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
int main(int argc,char **argv)
{
int fdSrc;//源文件
int fdDes;//目标文件
char readBuf[1024];
if(argc != 3){ //判断参数个数
puts("pararm error");
exit(-1);
}
fdSrc = open(argv[1],O_RDWR); //a.打开src.c文件
int n_read = read(fdSrc,readBuf,1024); //b.读src.c 到 buf
fdDes = open(argv[2],O_RDWR | O_CREAT,0600); //c
int n_write = write(fdDes,readBuf,strlen(readBuf)); //d
close(fdSrc);
close(fdDes);//e
return 0;
}~
CLC@Embed_Learn:~$ ./a.out
pararm errorCLC@Embed_Learn:~$ gcc demo14.c -o mycp
CLC@Embed_Learn:~$
CLC@Embed_Learn:~$
CLC@Embed_Learn:~$ ./mycp demo1.c new.c
CLC@Embed_Learn:~$
CLC@Embed_Learn:~$
CLC@Embed_Learn:~$ ls
a.out mycp demo1.c new.c snakemap.c~
问题一:打开new.c文件后面带有^C? 解决:对数组初始化0.
char readBuf[1024] = {0};
问题二:1024空间浪费!优化
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
int main(int argc,char **argv)
{
int fdSrc;
int fdDes;
char *readBuf = NULL;//野指针
if(argc != 3){
puts("pararm error");
exit(-1);
}
fdSrc = open(argv[1],O_RDWR);
int size = lseek(fdSrc,0,SEEK_END);//利用光标0到尾巴计算size
lseek(fdSrc,0,SEEK_SET); //记得把光标移动到头头
readBuf =(char *) malloc(sizeof(char)*size + 8);//初始化空间
int n_read = read(fdSrc,readBuf,1024);
fdDes = open(argv[2],O_RDWR | O_CREAT,0600);
int n_write = write(fdDes,readBuf,strlen(readBuf));
close(fdSrc);
close(fdDes);
return 0;
}
CLC@Embed_Learn:~$ ./mycp demo15.c new.c
CLC@Embed_Learn:~$
CLC@Embed_Learn:~$ ls
a.out new.c snakemap.c demo15.c
问题三:隐藏bug:上个代码只支持1024大小;目标文件已存在,把内容清空后cp
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
int main(int argc,char **argv)
{
int fdSrc;
int fdDes;
char *readBuf = NULL;
if(argc != 3){
puts("pararm error");
exit(-1);
}
fdSrc = open(argv[1],O_RDWR);
int size = lseek(fdSrc,0,SEEK_END);
lseek(fdSrc,0,SEEK_SET);
readBuf =(char *) malloc(sizeof(char)*size + 8);
int n_read = read(fdSrc,readBuf,size); //文件大小自己定:size
fdDes = open(argv[2],O_RDWR | O_CREAT | O_TRUNC,0600); // O_TRUNC的使用
int n_write = write(fdDes,readBuf,strlen(readBuf));
close(fdSrc);
close(fdDes);
return 0;
}