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.open是UNIX系统调用函数(包括LINUX等),返回的是文件描述符(File Descriptor),它是文件在文件描述符表里的索引。
2.fopen是ANSIC标准中的C语言库函数,在不同的系统中应该调用不同的内核api。返回的是一个指向文件结构的指针。
PS:从来源来看,两者是有千丝万缕的联系的,毕竟C语言的库函数还是需要调用系统API实现的。 -
移植性
这一点从上面的来源就可以推断出来,fopen
是C标准函数,因此拥有良好的移植性;而open
是UNIX系统调用,移植性有限。如windows下相似的功能使用API函数CreateFile
。 -
适用范围
open返回文件描述符,而文件描述符是UNIX系统下的一个重要概念,UNIX下的一切设备都是以文件的形式操作。如网络套接字、硬件设备等。当然包括操作普通正规文件(Regular File)。
fopen是用来操纵普通正规文件(Regular File)的。 -
文件IO层次
如果从文件IO的角度来看,前者属于低级IO函数,后者属于高级IO函数。低级和高级的简单区分标准是:谁离系统内核更近。低级文件IO运行在内核态,高级文件IO运行在用户态。 -
缓冲
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库对文件的操作的主要内容,如果未能解决你的问题,请参考以下文章