1.实现linux系统的cp命令
复制文件,首先我们要打开这个文件,把里面的内容复制下来,再开打另一个文件,把复制内容放进去。这样就实现了一个文件的复制。总结下来就四步:
(1)打开要原文件。
(2)读取要复制的内容。
(3)打开要复制的文件。
(4)写入复制的内容关闭文件。
代码实现如下:
int main(int argc,char **argv)
{
int fdsrc;//原文件
int fddes;//要复制文件
char *readbuf=NULL;//定义要读取的内容字符串
if(argc != 3)//如果参数不是三个则复制失败,退出。
{
printf("pararm error\n");
exit(-1);
}
fdsrc = open(argv[1],O_RDWR);//打开原文件
int n_lseek = lseek(fdsrc,0,SEEK_END);//实现光标函数测量文件大小。
lseek(fdsrc,0,SEEK_SET);//测量后要复位回到文件开始位置。
readbuf = (char *)malloc(sizeof(char)*n_lseek +8);//这里是读取内容空间大小,后面+8预留位置防止bug;
int n_read = read(fdsrc,readbuf,n_lseek); //读取了文件内容,返回读取多少字节
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;
}
关于main(int argc,char **arhv):
argc:用来统计命令行参数的个数,要算上./a.out;
argv:
argv[0]:指向文件运行的全路径名,就是执行程序路径。
argv[1]:指向命令行中执行程序名后的第一个字符串。
argv[3]:执行程序后面第二个参数。
例如:
int main(int argc,char **argv)
{
printf("totol params:%d\n",argc);
printf("NO.1 params:%s\n",argv[0]);
printf("NO.1 params:%s\n",argv[1]);
printf("NO.1 params:%s\n",argv[2]);
return 0;
}
运行结果:
2.使用文件操作修改配置文件。
修改配置文件,我们打开一个配置文件,读取文件,找到想要修改的地方,修改它。我们把文件读入一个字符数组中,利用strstr()函数查找想要修改的段。例如我们在字符数组中查找想要的字符串“ZFYHS=”,而我们想修等于后面的字,这时字符数组中有这个子片段就会返回Z那个地方的指针,我们在计算一下想要修改的位置的偏移大小,加上这偏移大小,到达位置后修改,再次写入就完成了修改配置文件。总结为:
1.打开配置文件,读取文件内容。
2.找到想要修改字符串的位置,计算偏移量。
3.找对位置修改后,再次写入文件,完成修改。
代码如下:
int main(int argc,char **argv)
{
int fdsrc;
char *readbuf=NULL;//定义读取内容数组
fdsrc = open(argv[1],O_RDWR);//打开文件
int n_lseek = lseek(fdsrc,0,SEEK_END);//光标测量大小
lseek(fdsrc,0,SEEK_SET);//光标归位。
readbuf = (char *)malloc(sizeof(char)*n_lseek +8);//分配空间
int n_read = read(fdsrc,readbuf,n_lseek);//读取文件
char *p = strstr(readbuf,"LENG=");//找修改位置
if(p == NULL){//如果没有,退出。
printf("not found");
}
p = p+strlen("LENG=");//计算偏移量并找到修改位置
*p = '9';
lseek(fdsrc,0,SEEK_SET);光标归位,因为读取时使光标移动
int n_write = write(fdsrc,readbuf,strlen(readbuf));写入文件;
close(fdsrc);
return 0;
}
3.想文件写入一个整数和结构体。
同样是打开文件,写入想要的内容,关闭文件就ok了;
代码如下:从2中代码注释
int main()
{
int fd;
int a = 100;
int b = 0;
fd = open("./file1",O_RDWR);
int n_write = write(fd,&a,sizeof(a));//write函数中buf这个第二个参数是无类型指针,这里是整形指针,read同理;
lseek(fd,0,SEEK_SET);
//看一下写入的是否正确,打印验证一下。
int n_read = read(fd,&b,sizeof(b));
printf("read:%d",b);
close(fd);
return 0;
}
写入结构体同理,定义一个结构体,把整形数据换成结构体就可以了。