C語言實(shí)現(xiàn)修改文本文件中特定行的實(shí)現(xiàn)代碼
好的,首先我先敘述下功能要求:
其實(shí)很簡單,就是Shell中sed命令的C語言實(shí)現(xiàn),實(shí)現(xiàn)定位到所需要的字段的那一行,之后修改成需要的內(nèi)容。但是由于C語言是面向過程的語言,需要順序執(zhí)行的特點(diǎn),所以,實(shí)現(xiàn)中遇到了很多麻煩,在這里博主將實(shí)現(xiàn)的過程描述如下,以便大家參考。
問題描述:
文本內(nèi)容:
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
我需要做的就是修改第四行的內(nèi)容,使之變?yōu)椋?/P>
wireless.1.current_state=0
問題看似簡單,實(shí)現(xiàn)過程頗費(fèi)周折。。。
這里我給出實(shí)現(xiàn)的代碼,注釋已經(jīng)加在代碼中:
/*
* 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))
{
/*
* 由于已經(jīng)找到所需要寫的位置,所以需要寫位置的“頭”
*/
len -= strlen(linebuffer);
/*
* 實(shí)現(xiàn)文件位置的偏移,為寫文件做準(zhǔn)備
*/
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));
/*
* 寫文件,存入所需的內(nèi)容
*/
fprintf(fp, "%s", buffer1);
fclose(fp);
return;
}
}
return 0;
}
保存文件名為:my_sed.c
運(yùn)行效果如下:

我們再來看文件中的內(nèi)容已經(jīng)變?yō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
實(shí)現(xiàn)原理:
這里實(shí)現(xiàn)的效率比較高,因?yàn)椴皇前颜麄€文件的內(nèi)容裝入緩沖區(qū)中,而是一行一行的讀取,知道匹配為止,之后利用寫文件的特性,直接覆蓋所寫內(nèi)容即可,由此完成所需功能
相關(guān)文章
C++設(shè)計(jì)類不能被繼承的方法實(shí)例講解
在Java 中定義了關(guān)鍵字final,被final修飾的類不能被繼承,C++中如何實(shí)現(xiàn),下面我們來看一個例子2013-12-12
C語言超詳細(xì)講解棧與隊(duì)列實(shí)現(xiàn)實(shí)例
棧和隊(duì)列,嚴(yán)格意義上來說,也屬于線性表,因?yàn)樗鼈円捕加糜诖鎯壿嬯P(guān)系為?"一對一"?的數(shù)據(jù),但由于它們比較特殊,因此將其單獨(dú)作為一章,做重點(diǎn)講解2022-03-03
VS2019+MPI配置過程的實(shí)現(xiàn)步驟
本文介紹了在VS2019上配置MPI,包括下載和安裝MPI、創(chuàng)建項(xiàng)目、配置屬性、導(dǎo)入頭文件和庫文件、添加依賴項(xiàng)等步驟,具有一定的參考價值,感興趣的可以了解一下2024-12-12
C++程序的五大內(nèi)存分區(qū)實(shí)例詳解
C++內(nèi)存區(qū)域,一般可分為棧內(nèi)存區(qū)、堆內(nèi)存區(qū)、全局/靜態(tài)內(nèi)存區(qū)、文字常量內(nèi)存區(qū)及程序代碼區(qū)5大分區(qū),本文就帶大家深刻的理解這5大內(nèi)存分區(qū),感興趣的可以了解一下2021-10-10

