C语言实现修改文本文件中的特定行2013-11-25 csdn博客 BruceZhang最近由于项目需要实现修改文件的功能,所以,博主认真查阅了一些资料,但是,很遗憾,并没有太多的 收获。好的,首先我先叙述下功能要求:其实很简单,就是Shell中sed命令的C语言实现,实 现定位到所需要的字段的那一行,之后修改成需要的内容。但是由于C语言是面向过程的语言,需要顺序执行 的特点,所以,实现中遇到了很多麻烦,在这里博主将实现的过程描述如下,以便大家参考。问题描 述:文本内容:
wireless.1.authmode=1wireless.1.compression=0wireless.1.current_ap=ssid12wireless.1.current_state=1wireless.1.devname=ath0wireless.1.enable_slave1_status=disabledwireless.1.enable_slave2_status=disabledwireless.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;}