Linux系统编程(文件)———文件编程应用(配置文件修改,写结构体数组到文件),标准C库对文件的操作

Posted 橙子果果

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux系统编程(文件)———文件编程应用(配置文件修改,写结构体数组到文件),标准C库对文件的操作相关的知识,希望对你有一定的参考价值。

配置文件的修改

比如这是我们的一个软件的配置文件

我们需要将LENG的参数改成5
操作
1.找到需要修改的字段的的首位置。
2.首位置往后移到需要修改的参数的位置
3.修改参数的内容

#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)


        int fdSrc;
        char *readBuf=NULL;
        if(argc != 2)
                printf("PARARM ERROR\\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=");
        if(p==NULL)
                printf("not found\\n");
                exit(-1);
        

        p = p+strlen("LENG=");
        *p = '5';


        lseek(fdSrc,0,SEEK_SET);

        int n_write = write(fdSrc,readBuf,strlen(readBuf));



        close(fdSrc);

        return 0;

这里有一个strstr的函数,它的作用就是找到内容的位置。返回指针。
之后光标就在找到的内容的头位置
然后移动光标的位置,并对光标处的内容进行写入。

这里*p = ‘5’,就直接把LENG=后面的内容写成了5(注意:写到文件里的都是字符)
最后要移动光标在写入文件。

写结构体数组到文件

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.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,'a',110,'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;


运行结果

标准C库对文件的操作

fopen和open的区别

  1. 来源
    从来源的角度看,两者能很好的区分开,这也是两者最显而易见的区别:

    1.open是UNIX系统调用函数(包括LINUX等),返回的是文件描述符(File Descriptor),它是文件在文件描述符表里的索引。
    2.fopen是ANSIC标准中的C语言库函数,在不同的系统中应该调用不同的内核api。返回的是一个指向文件结构的指针。
    PS:从来源来看,两者是有千丝万缕的联系的,毕竟C语言的库函数还是需要调用系统API实现的。

  2. 移植性
    这一点从上面的来源就可以推断出来,fopen是C标准函数,因此拥有良好的移植性;而open是UNIX系统调用,移植性有限。如windows下相似的功能使用API函数CreateFile

  3. 适用范围
    open返回文件描述符,而文件描述符是UNIX系统下的一个重要概念,UNIX下的一切设备都是以文件的形式操作。如网络套接字、硬件设备等。当然包括操作普通正规文件(Regular File)。
    fopen是用来操纵普通正规文件(Regular File)的。

  4. 文件IO层次
    如果从文件IO的角度来看,前者属于低级IO函数,后者属于高级IO函数。低级和高级的简单区分标准是:谁离系统内核更近。低级文件IO运行在内核态,高级文件IO运行在用户态。

  5. 缓冲

    1.缓冲文件系统
    缓冲文件系统的特点是:在内存开辟一个“缓冲区”,为程序中的每一个文件使用;当执行读文件的操作时,从磁盘文件将数据先读入内存“缓冲区”,装满后再从内存“缓冲区”依此读出需要的数据。执行写文件的操作时,先将数据写入内存“缓冲区”,待内存“缓冲区”装满后再写入文件。由此可以看出,内存“缓冲区”的大小,影响着实际操作外存的次数,内存“缓冲区”越大,则操作外存的次数就少,执行速度就快、效率高。一般来说,文件“缓冲区”的大小随机器 而定。fopen, fclose, fread, fwrite, fgetc, fgets, fputc, fputs, freopen, fseek, ftell, rewind等。
    2.非缓冲文件系统
    缓冲文件系统是借助文件结构体指针来对文件进行管理,通过文件指针来对文件进行访问,既可以读写字符、字符串、格式化数据,也可以读写二进制数据。非缓冲文件系统依赖于操作系统,通过操作系统的功能对文件进行读写,是系统级的输入输出,它不设文件结构体指针,只能读写二进制文件,但效率高、速度快,由于ANSI标准不再包括非缓冲文件系统,因此建议大家最好不要选择它。open, close, read, write, getc, getchar, putc, putchar等。

代码实现:

#include <stdio.h>
#include <string.h>

int main()

    FILE *fp;
    char *str = "Hello Ubantu!!!!!";
    char readBuf[128] = 0;

    fp = fopen("./chen.txt","w+");

    fwrite(str,sizeof(char)*strlen(str),1,fp);
    fseek(fp,0,SEEK_SET);
    fread(readBuf,sizeof(char)*strlen(str),1,fp);
    printf("read data:%s\\n",readBuf);
    fclose(fp);

    return 0;


其余的标准C库对文件的操作API基本类似于Linux下文件操作。

以上是关于Linux系统编程(文件)———文件编程应用(配置文件修改,写结构体数组到文件),标准C库对文件的操作的主要内容,如果未能解决你的问题,请参考以下文章

Linux系统编程(文件)———文件编程应用(配置文件修改,写结构体数组到文件),标准C库对文件的操作

Shell 编程时常用的系统文件

Shell编程时常用的系统文件

Linux系统编程 | 01 -文件操作

Linux系统编程 | 01 -文件操作

LINUX系统编程之进程