C語言實現修改文字檔中特定行的實現代碼

來源:互聯網
上載者:User

好的,首先我先敘述下功能要求:
其實很簡單,就是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

實現原理:

這裡實現的效率比較高,因為不是把整個檔案的內容裝入緩衝區中,而是一行一行的讀取,知道匹配為止,之後利用寫檔案的特性,直接覆蓋所寫內容即可,由此完成所需功能

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.