源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

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

  • 时间:2022-03-19 07:44 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:C语言实现修改文本文件中特定行的实现代码
好的,首先我先叙述下功能要求: 其实很简单,就是Shell中sed命令的C语言实现,实现定位到所需要的字段的那一行,之后修改成需要的内容。但是由于C语言是面向过程的语言,需要顺序执行的特点,所以,实现中遇到了很多麻烦,在这里博主将实现的过程描述如下,以便大家参考。 问题描述: 文本内容:
[u]复制代码[/u] 代码如下:
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
我需要做的就是修改第四行的内容,使之变为:
[u]复制代码[/u] 代码如下:
wireless.1.current_state=0
问题看似简单,实现过程颇费周折。。。 这里我给出实现的代码,注释已经加在代码中:
[u]复制代码[/u] 代码如下:
/*  * 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 运行效果如下: [img]http://files.jb51.net/file_images/article/201306/201362510533158.gif[/img] 我们再来看文件中的内容已经变为:
[u]复制代码[/u] 代码如下:
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
[b]实现原理: [/b] 这里实现的效率比较高,因为不是把整个文件的内容装入缓冲区中,而是一行一行的读取,知道匹配为止,之后利用写文件的特性,直接覆盖所写内容即可,由此完成所需功能
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部