博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C语言实现修改文本文件中的特定行
阅读量:6550 次
发布时间:2019-06-24

本文共 2020 字,大约阅读时间需要 6 分钟。

     最近由于项目需要实现修改文件的功能,所以,博主认真查阅了一些资料,但是,很遗憾,并没有太多的收获。

好的,首先我先叙述下功能要求:

其实很简单,就是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
#include
#include
#include
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=1wireless.1.compression=0wireless.1.current_ap=ssid12wireless.1.current_state=0wireless.1.enable_slave1_status=disabledwireless.1.enable_slave2_status=disabledwireless.1.enable_slave3_status=disabled

实现原理:

 

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

 

你可能感兴趣的文章
基于C#的MongoDB数据库开发应用(1)--MongoDB数据库的基础知识和使用
查看>>
UWP消息通知
查看>>
反射工具类.提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class,被AOP过的真实类等工具函数.java...
查看>>
电子学习产品缘何备受青睐?
查看>>
名词解释
查看>>
webmagic 下载页面
查看>>
探索c#之一致性Hash详解
查看>>
jQuery操作DOM
查看>>
【转】IE6、IE7下绝对定位position:absolute和margin的冲突bug解决方法
查看>>
2017 校赛 问题 E: 神奇的序列
查看>>
leetcode 46-Permutations and 47-Permutations II
查看>>
每日一小练——二项式系数加法解
查看>>
培养良好的注释习惯
查看>>
比较讨厌的一种编程方式
查看>>
IO多路复用之epoll
查看>>
双向链表实现队列与循环链表
查看>>
Git多帐号配置,管理多个SSH
查看>>
Windows平台下Glade+GTK开发环境的搭建
查看>>
iOS 7 Development Tips, Tricks & Hacks
查看>>
i/10和i取最后两位的精妙算法(前方高能)
查看>>