linux文件编程(3)—— main函数传参、myCp(配置成环境变量)、修改配置文件、将整数和结构体数组写到文件

参考: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函数传参

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)把源文件的内容读入buf
        char* readBuf = (char* )malloc(sizeOfSrc);
        memset(readBuf,'\0',sizeOfSrc);
        int retRead = read(fdSrc,readBuf,sizeOfSrc);
        
        //(3)创建目标文件,如果已经存在则覆盖  //O_TRUN原文件度先截为0
        int 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)把源文件的内容读入buf
        int retRead = read(fdSrc,readBuf,sizeOfSrc);
        if(retRead < 0){
                printf("read error\n");
                exit(-1);
        }
        
        //(3)创建目标文件,如果已经存在则覆盖  //O_TRUN原文件长度截为0
        int 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)读取文件内容到readBuf
        read(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;
}

运行结果:
在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

行稳方能走远

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值