Linux——文件(2)——文件操作原理以及编程实现CP指令和修改配置文件,写结构体到文件

本文介绍了Linux中文件描述符的基础概念,如何通过C语言实现CP指令,包括打开源文件、读取内容、写入目标文件,并详细讲解了结构体写入文件的过程。重点讨论了动态文件和静态文件的区别以及相关函数的使用技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文件描述符

对于内核而言,所有打开文件都由文件描述符引用。文件描述符是一个非负整数。

Linux系统有默认的标识符:0 1 2
标准输入 标准输出 标准错误

文件描述符的作用域仅在当前进程

在Linux中操作一个文件,一般是先open一个文件,得到文件描述符后对文件进行读写等操作,最后close文件

文件分为静态文件和动态文件

静态文件:在磁盘里存在的文件未被打开
动态文件:open静态文件以后,会产生一个结构体,里面存放fd文件描述符,信息节点,buf(内存)存文件内容,调用close将动态文件存到磁盘,成为静态文件。

编程实现CP指令

C语言参数 argc argv

#include<stdio.h>
int main(int argc,char **argv)
{
	//这里的argc是为了统计 cp src.c des.c指令 字符串数目
	//argv[0] argv[1] argv[2]  代表每个字符串数组元素 
	return 0;
}

实现指令思路

1.打开源文件
2.把文件内容读到buf里
3.打开/创建目标文件
4.将buf里的内容写到目标文件
5.close源文件 目标文件

实现代码

#include<fcntl.h>
#include<sys/stat.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){
                printf("shu ru you wu!\n");  //这个判断防止 少输一个文件名 或者多输一个文件名
                exit(-1);
        }

        fdSrc=open(argv[1],O_RDWR); 
        //argv[1]代表cp指令的源文件 
        int size=lseek(fdSrc,0,SEEK_END);   //因为读写的时候我们都要输入文件的size 做个动态的size 防止给固定size 出bug  例如 给个1024的大小 那么里拷贝的时候只能拷贝小于等于1024的文件 不然就出错
        //这里lseek函数的返回值正好就是文件的大小
        lseek(fdSrc,0,SEEK_SET);   //因为统计文件大小时光标被推到了末尾,读的时候会从光标位置开始读,所以将光标重置为开头位置
        readBuf=(char *)malloc(sizeof(char)*size+8); //这里要将定义的readbuf开空间 +8是为了防止溢出
        int n_read=read(fdSrc,readBuf,size);

        fdDes=open(argv[2],O_RDWR|O_CREAT|O_TRUNC,0600);
        //这里 如果你打开的目标文件已存在 并且里面有内容 新写入的内容只会覆盖  所以需要O_TRUNC来清零文件
        int n_write=write(fdDes,readBuf,size);



        close(fdSrc);
        close(fdDes);
        return 0;

}

修改配置文件

#include<stdio.h>
#include<sys/types.h>
#include<fcntl.h>
#include<sys/stat.h>
#include<unistd.h>
#include<string.h>
#include<stdlib.h>

int main(int argc,char **argv)
{
        int fdSrc;


        char *readBuf=NULL;
        if(argc != 2){
                printf("shu ru you wu!\n");
                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);
        char *p=strstr(readBuf,"LENG=");
        //使用strstr函数在readbuf里查找修改字符返回值为一个字符指针
        if(p==NULL){//判断是否找到
                printf("not find\n");
                exit(-1);
        }
        p=p+strlen("LENG=");//将指针的位置往后移到修改的内容位置
        *p='5'; //修改的内容是字符 如果写整数5就会出错


        lseek(fdSrc,0,SEEK_SET); //重置光标位置到开头
        int n_write=write(fdSrc,readBuf,size);
		//将修改好的buf内容写入文件


        close(fdSrc);
        return 0;

}


写结构体到文件

#include<stdio.h>
#include<sys/types.h>
#include<fcntl.h>
#include<sys/stat.h>
#include<unistd.h>
#include<string.h>
#include<stdlib.h>
struct Test
{
        int a;
        char c;
};

int main()
{
        int fd;
        struct Test data[2]={{100,'h'},{200,'a'}};
		//定义一个结构体数组
        fd = open("./file1",O_RDWR);

        int n_write=write(fd,&data,sizeof(struct Test)*2);
        //buf是一个常量指针 是个地址就行  这样就可以往文件里写整数、结构体
        lseek(fd,0,SEEK_SET);
		
        int n_read=read(fd,&data,sizeof(struct Test)*2);


        printf("read:%d,%c \n",data[0].a,data[0].c);
        printf("read:%d,%c \n",data[1].a,data[1].c);
        close(fd);
        return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值