C语言实现修改文本文件中特定行的实现代码

  • A+
所属分类:没事瞎侃

最近由于项目需要实现修改文件的功能,所以,博主认真查阅了一些资料,但是,很遗憾,并没有太多的收获

好的,首先我先叙述下功能要求:

其实很简单,就是Shell中sed命令的C语言实现,实现定位到所需要的字段的那一行,之后修改成需要的内容。但是由于C语言是面向过程的语言,需要顺序执行的特点,所以,实现中遇到了很多麻烦,在这里博主将实现的过程描述如下,以便大家参考。

问题描述:

文本内容:

  1. wireless.1.authmode=1  
  2. wireless.1.compression=0  
  3. wireless.1.current_ap=ssid12  
  4. wireless.1.current_state=1  
  5. wireless.1.devname=ath0  
  6. wireless.1.enable_slave1_status=disabled  
  7. wireless.1.enable_slave2_status=disabled  
  8. wireless.1.enable_slave3_status=disabled  

我需要做的就是修改第四行的内容,使之变为:

  1. wireless.1.current_state=0  

问题看似简单,实现过程颇费周折。。。

这里我给出实现的代码,注释已经加在代码中:

  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <string.h>  
  4. #include <unistd.h>  
  5. int main(){  
  6.     /* 
  7.     *linebuffer:读取文件中的一行存入的缓冲 
  8.     *buffer1:一行中第一个字段的存入缓冲 
  9.     *buffer2:一行中第二个字段的存入缓冲 
  10.     */  
  11.     char linebuffer[512]={0};  
  12.     char buffer1[512]={0};  
  13.     char buffer2[512]={0};  
  14.     int line_len = 0;  
  15.     int len = 0;  
  16.     int res;  
  17.     /* 
  18.     *cc.cfg是文件名,r+代表可以读写文件 
  19.     */  
  20.     FILE *fp=fopen("cc.txt","r+");  
  21.     if(fp==NULL){  
  22.         printf("open error");  
  23.         return -1;  
  24.     }  
  25.     while(fgets(linebuffer,512,fp)){  
  26.         line_len=strlen(linebuffer);  
  27.         len+=line_len;  
  28.         /* 
  29.         *buffer1=wireless.1.current_state 
  30.         *buffer2=1 
  31.         */  
  32.         sscanf(linebuffer,"%[^=]=%[^=]",buffer1,buffer2);  
  33.         if(!strcmp("wireless.1.current_state",buffer1)){  
  34.             /* 
  35.             *由于已经找到所需要写的 位置,所以需要写位置的“头” 
  36.             */  
  37.             len-=strlen(linebuffer);  
  38.             /* 
  39.             *实现文件位置的偏移,为写文件做准备 
  40.             */  
  41.             res = fseek(fp,len,SEEK_SET);  
  42.             if(res<0){  
  43.                 perror("fseek");  
  44.                 return -1;  
  45.             }  
  46.             strcpy(buffer2,"=0");  
  47.             /*strcat(buffer1,"=");*/  
  48.             strcat(buffer1,buffer2);  
  49.             printf("%d",strlen(buffer1));  
  50.             /*写文件,存入所需的内容*/  
  51.             fprintf(fp,"%s",buffer1);  
  52.             fclose(fp);  
  53.         }  
  54.     }  
  55.     return 0;  
  56. }  

我们再来看文件中的内容已经变为:

  1. wireless.1.authmode=1   
  2. wireless.1.compression=0   
  3. wireless.1.current_ap=ssid12   
  4. wireless.1.current_state=0   
  5. wireless.1.enable_slave1_status=disabled   
  6. wireless.1.enable_slave2_status=disabled   
  7. wireless.1.enable_slave3_status=disabled   

实现原理:

这里实现的效率比较高,因为不是把整个文件的内容装入缓冲区中,而是一行一行的读取,知道匹配为止,之后利用写文件的特性,直接覆盖所写内容即可,由此完成所需功能

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

目前评论:1   其中:访客  1   博主  0

    • Young小杰 Young小杰 1

      挺不错的教程