??这篇博客主要是用来模拟cp的功能,在linux中cp具有复制的功能。如cp 文件1 文件2,就是把文件1的内容复制到文件2中。这里我们要通过自己写代码实现这些功能。
??思路如下
①打开文件1
②读取文件1的值到缓冲区
③创建并打开文件2
④将缓冲区的内容写文件2
⑤关闭文件1和文件2
其中文件1我们用demo6.c表示,文件2我们用dem07.c表示
创建test.c文件用来模拟cp功能
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
int main (int argc,char**argv)
{
int fdScr;//文件1文件描述符
int fdDes; //文件2文件描述符
char *Readbuf;
if(argc!=3)//看输入是不是3个参数,如果是就就需执行,如果不是就终止
{
? printf("pararm error\n");
? exit(-1);
}
fdScr=open(argv[1],O_RDWR);
int size=lseek(fdScr,0,SEEK_END);//巧用lseek函数来测量文件1大小
lseek(fdScr,0,SEEK_SET);//将文件光标放到文件头部
Readbuf=(char*)malloc(sizeof(char)*size+1);//依据文件大小用malloc申请空间,Readbuf不成为野指针
int n_read=read(fdScr,Readbuf,size);//依据文件的大小将文件内容读入缓冲区
fdDes=open(argv[2],O_RDWR|O_CREAT|O_TRUNC,0600);//创建打开文件2,并且将flag的参数中加入O_TRUNC,让文件打开时清空原来的内容
int n_write=write(fdDes,Readbuf,strlen(Readbuf));//将Readbuf的内容写入文件2
close(fdScr);//关闭两个文件
close(fdDes);
return 0;
}
运行程序后如下图
argv[0]对应./mycp, argv[1]对应demo4.c,argv[2]对应new.c
话句话说
argv[0]对应cp, argv[1]对应文件1,argv[2]对应文件2
原本应该是cp 文件1文件2实现的复制功能,
现在我们通过./mycp demo4.c new.c也可以实现,那么demo4.c与new.c的内容应该相同
下面我们输入vimdiff demo4.c new.c看看这两个文件是否相同
可以看到两个文件的内容都是一样的,说明我们模拟实现了cp的功能
Linux下修改文件参数
??这里我们要先建立一个TEST.config文档,并赋予文档中的参数一些值,如下图所示
下面我们要修改一些参数的数值,比如将SPEED的值修改为8。
思路是这样的
先打开文件,读出文件的内容到缓冲区,然后利用strstr(参数1,参数2)函数找到我们先要修改的参数,并利用指针进行修改。利用strstr函数比较,如果第一个参数包含了第二个参数的内容,那么将会返回一个指针,指向第二个参数所在的第一个参数的位置;如果不包含,那么就会返回一个空指针。
下面是程序
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
int main (int argc,char**argv)
{
int fdScr;
char *Readbuf;
if(argc!=2)//执行文件和要修改的文件两个参数
{
? printf("pararm error\n");
? exit(-1);
}
fdScr=open(argv[1],O_RDWR);//打开文件
if(fdScr==-1)//如果打开失败返回文件描述符-1,程序终止
{
printf("open failed\n");
exit(-1);
}
int size=lseek(fdScr,0,SEEK_END);//利用lseek函数得到文件大小
lseek(fdScr,0,SEEK_SET);//将文件光标置于文章开头
Readbuf=(char*)malloc(sizeof(char)*size+1);//malloc申请空间,避免成为野指针
int n_read=read(fdScr,Readbuf,size);//读出文件的内容并放入缓冲区
if(n_read==-1) /如果读取失败返回值是-1,程序终止
{
printf("read failed\n");
exit(-1);
}
char*p =strstr(Readbuf," SPEED");//如果缓冲区Readbuf包含SPEED,就会以指针的方式返回文件中SPEED的起始位置
if(p==NULL)//如果找不到,返回空指针,结束程序,提示 not found
{
printf("not found\n");
exit(-1);
}
p=p+strlen("SPEED=");//利用strlen函数计算SPEED=的大小,讲指针放到数字3的位置
*p='8';//修改数字3为8
lseek(fdScr,0,SEEK_SET);//将文件光标置于文件开头,下次打开文件的时候就不会有原文件和修改后的文件同时出现的现象了。
int n_write=write(fdScr,Readbuf,strlen(Readbuf));//将修改后的Readbuf缓冲区数据写入原文件中
if(n_write==-1) /如果写入失败返回值是-1,程序终止
{
printf("write failed\n");
exit(-1);
}
close(fdScr);//关闭文件
return 0;
}
执行过程及结果如下图所示,可以看到TEST.config中的SPEED参数已经被修改为8