当前位置:主页 > 软件编程 > C代码 >

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

时间:2021-04-10 08:51:30 | 栏目:C代码 | 点击:

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

问题描述:

文本内容:

复制代码 代码如下:

wireless.1.authmode=1
wireless.1.compression=0
wireless.1.current_ap=ssid12
wireless.1.current_state=1
wireless.1.devname=ath0
wireless.1.enable_slave1_status=disabled
wireless.1.enable_slave2_status=disabled
wireless.1.enable_slave3_status=disabled

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

复制代码 代码如下:

wireless.1.current_state=0

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

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

复制代码 代码如下:

/*
 * Author:DLUTBruceZhang
 * Date: 2013.06.24
 */
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
int main()
{
 /*
  *linebuffer:读取文件中的一行存入的缓冲
  *buffer1:一行中第一个字段的存入缓冲
  *buffer2:一行中第二个字段的存入缓冲
  */
 char linebuffer[512] = {0};
 char buffer1[512] = {0};
 char buffer2[512] = {0};

 int line_len = 0;
 int len = 0;
 int res;

 /*
  * cc.cfg是文件名,r+代表可以读写文件
  */
 FILE *fp = fopen("cc.cfg", "r+");
 if(fp == NULL)
 {
  printf("open error");
  return -1;
 }
 while(fgets(linebuffer, 512, fp))
 {
  line_len = strlen(linebuffer);
  len += line_len;
  /*
   * buffer1=wireless.1.current_state
   * buffer2=1
   */
  sscanf(linebuffer, "%[^=]=%[^=]", buffer1,buffer2);
  if(!strcmp("wireless.1.current_state", buffer1))
  {
   /*
    * 由于已经找到所需要写的位置,所以需要写位置的“头”
    */
   len -= strlen(linebuffer);
   /*
    * 实现文件位置的偏移,为写文件做准备
    */
   res = fseek(fp, len, SEEK_SET);
   if(res < 0)
   {
    perror("fseek");
    return -1;
   }
   strcpy(buffer2, "=0");
   /*strcat(buffer1, "=");*/
   strcat(buffer1, buffer2);
   printf("%d",strlen(buffer1));
   /*
    * 写文件,存入所需的内容
       */
   fprintf(fp, "%s", buffer1);
   fclose(fp);
   return;
  }
 }
return 0;
}

保存文件名为:my_sed.c

运行效果如下:

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

复制代码 代码如下:

wireless.1.authmode=1
wireless.1.compression=0
wireless.1.current_ap=ssid12
wireless.1.current_state=0
wireless.1.enable_slave1_status=disabled
wireless.1.enable_slave2_status=disabled
wireless.1.enable_slave3_status=disabled


实现原理:

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

您可能感兴趣的文章:

相关文章