参考:linux文件编程(3)—— 文件编程的简单应用:myCp、修改配置文件
作者:丶PURSUING
发布时间: 2021-04-09 23:45:05
网址:https://blog.csdn.net/weixin_44742824/article/details/115209404
部分参考:https://leo-max.blog.csdn.net/article/details/112966334
目录
- 实现cp指令
- 掌握向main函数传参
- cp指令实现思路
- 实现代码
- myCp指令全局可用
- 修改配置文件
- 将整数写到文件
- 将结构体数组写到文件
实现cp指令
掌握向main函数传参
int main(int argc,char** argv )/** 参数
argc: 参数个数
**argv:二级指针,数组的指针(argv[0]、argv[1]、argv[2]...),即这个指针里的每一项都是一个数组(字符串)
**/
最直观的还是例子
#include <stdio.h>int main(int argc,char** argv)
{printf("参数个数:%d\n",argc);printf("argv[0]:%s\n",argv[0]);printf("argv[1]:%s\n",argv[1]);printf("argv[2]:%s\n",argv[2]);return 0;
}
运行结果:
cp指令实现思路
(1)打开src源文件(要被复制的文件)
(2)把源文件的内容读入buf
(3)创建目标文件
(4)把buf内容写入目标文件
(5)关闭源文件与目标文件
实现代码
(1)精简不带调试版
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>int main(int argc,char** argv)
{//(1)打开src源文件(要被复制的文件)int fdSrc = open(argv[1],O_RDWR);int sizeOfSrc = lseek(fdSrc,0,SEEK_END);lseek(fdSrc,0,SEEK_SET);//(2)把源文件的内容读入bufchar* readBuf = (char* )malloc(sizeOfSrc);memset(readBuf,'\0',sizeOfSrc);int retRead = read(fdSrc,readBuf,sizeOfSrc);//(3)创建目标文件,如果已经存在则覆盖 //O_TRUN原文件度先截为0int fdDes = open(argv[2],O_RDWR|O_CREAT|O_TRUNC,0600);//(4)把buf内容写入目标文件int retWrite = write(fdDes,readBuf,sizeOfSrc);//(5)关闭源文件与目标文件close(fdSrc);close(fdDes);return 0;
}
(2)打印调试信息对open,read,write的状态进行跟踪版
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>int main(int argc,char** argv)
{if(argc != 3){printf("参数个数错误\n");exit(-1);}//(1)打开src源文件(要被复制的文件)int fdSrc = open(argv[1],O_RDWR);if(fdSrc < 0){printf("open src error\n");}int sizeOfSrc = lseek(fdSrc,0,SEEK_END);lseek(fdSrc,0,SEEK_SET);char* readBuf = (char* )malloc(sizeOfSrc);memset(readBuf,'\0',sizeOfSrc);//(2)把源文件的内容读入bufint retRead = read(fdSrc,readBuf,sizeOfSrc);if(retRead < 0){printf("read error\n");exit(-1);}//(3)创建目标文件,如果已经存在则覆盖 //O_TRUN原文件长度截为0int fdDes = open(argv[2],O_RDWR|O_CREAT|O_TRUNC,0600);if(fdDes < 0){printf("open Des error\n");exit(-1);}//(4)把buf内容写入目标文件int retWrite = write(fdDes,readBuf,sizeOfSrc);if(retWrite < 0){printf("write error\n");exit(-1);}//(5)关闭源文件与目标文件close(fdSrc);close(fdDes);return 0;
}
运行结果:生成了和mainPro.c 一样的new.c
myCp指令全局可用
(1)查看当前所配置的环境变量
echo $PATH
发现并没有myCp可执行文件的路径,所以要手动添加进去。
在此之前,还可以创建一个文件夹,专门用来存放我们自己写的命令,如myCp,myLs等等,方便全局使用,而不仅仅限于所在路径下使用了。使用方法直接myCp XX XX(不必再使用./myCp XX XX这种方法了)。
(2)创建文件夹,把myCp放进去
mkdir MYPATH
(3)pwd
查看当前路径为:
/home/zhua/wenJian/MYPATH
- 1
(4)添加路径:
export PATH=$PATH:/home/zhua/wenJian/MYPATH
其中$PATH也可替换成上面图片所显示的环境变量,即:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:
(5)再次查看配置的环境变量:配置成功(在最后尾巴上,此时只要在这个文件夹下的可执行命令都可以在全局运行)
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/home/zhua/wenJian/MYPATH
修改配置文件
现有某配置文件如config
,要求利用文件编程把length的值修改为9.
文件运行参数:
score=90
length=5
high=10
简单示例:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>int main()
{//(1)打开配置文件int fdConfig = open("./config",O_RDWR);//(2)计算配置文件大小int sizeOfConfig = lseek(fdConfig,0,SEEK_END);lseek(fdConfig,0,SEEK_SET);char* readBuf = (char* )malloc(sizeOfConfig);memset(readBuf,'\0',sizeOfConfig);//(3)读取文件内容到readBufread(fdConfig,readBuf,sizeOfConfig);//(4)找到并修改length=后面的内容char* p = strstr(readBuf,"length=");p = p + strlen("length=");*p = '9';//(5)重新将内容写回去lseek(fdConfig,0,SEEK_SET);write(fdConfig,readBuf,sizeOfConfig);//(6)关闭文件close(fdConfig);return 0;
}
运行结果:
文件运行参数:
score=90
length=9
high=10
将整数写到文件
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>int main()
{int fd;int data = 100;int data2 = 0;fd = open("./file1",O_RDWR);int n_write = write(fd,&data,sizeof(int)); //加上&lseek(fd,0,SEEK_SET);int n_read = read(fd,&data2,sizeof(int)); //加上&printf("read %d \n",data2);close(fd);return 0;
}
运行结果:
打开文件file1,发现像是乱码,不用担心,这只是字符显示形式,不影响程序的执行结果。
将结构体数组写到文件
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>struct Test
{int a;char c;
};int main()
{int fd;struct Test data[2] = {{100,'a'},{101,'b'}};struct Test data2[2];fd = open("./file1",O_RDWR);int n_write = write(fd,&data,sizeof(struct Test)*2);lseek(fd,0,SEEK_SET);int n_read = read(fd,&data2,sizeof(struct Test)*2);printf("read %d %c\n",data2[0].a,data2[0].c);printf("read %d %c\n",data2[1].a,data2[1].c);close(fd);return 0;
}
运行结果: