C语言实现修改文本文件中的特定行
最近由于项目需要实现修改文件的功能,所以,博主认真查阅了一些资料,但是,很遗憾,并没有太多的收获。
好的,首先我先叙述下功能要求:
其实很简单,就是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
实现原理:
这里实现的效率比较高,因为不是把整个文件的内容装入缓冲区中,而是一行一行的读取,知道匹配为止,之后利用写文件的特性,直接覆盖所写内容即可,由此完成所需功能
C语言实现修改文本文件中的特定行的更多相关文章
- mongoose修改数组中某个特定的值
写博客的时候有一个这样的业务,一个标签集合和一个文章集合,它们是多对多的关系,文章集合中tags字段包含它对应的标签,现在修改标签集合中某条标签记录的名字,文章集合中所有包含这个标签的tags字段的值 ...
- 如何让 Git 忽略掉文件中的特定行内容?
近期在git遇到几个问题,让我重新认识到git的强大性,下面列出来记录一下 有一个数据库的配置文件,在用 git add 添加到 index file 时不能透露了相关配置.而如果用 .gitigno ...
- 用 python 修改文件中指定的行数
#! /bin/python filename='setup.ini' lines=[] with open(filename,'r') as f: lines=f.readlines() lines ...
- 获取文本文件的第N行内容
在PowerShell中,可以通过Get-Content这个cmdlet来获取文本文件的内容.Get-Content将一个文本文件读取到一个数组中,每一个数组元素就是文件的一行内容.比如一个文本文件内 ...
- 运用sed命令高效地删除文件的特定行
运用 sed 命令高效地删除文件的特定行 正常来说,我们想要删除文件中的某些行内容,一般都是先打开这个文件,然后找到要删除的内容,再然后选中这些行并按删除键进行删除,这在数据量很少时是没有问题的.但是 ...
- java往文本文件中写入信息并修改
题目要求: 1.可以往一个文本文档中写入员工信息:name,id和详情 2.可以更改name package FanCQ.Xue.practice; import java.io.*;import j ...
- 转载~kxcfzyk:Linux C语言多线程库Pthread中条件变量的的正确用法逐步详解
Linux C语言多线程库Pthread中条件变量的的正确用法逐步详解 多线程c语言linuxsemaphore条件变量 (本文的读者定位是了解Pthread常用多线程API和Pthread互斥锁 ...
- Red Hat Linux9命令行--修改补充中
1.使用rpm工具安装应用软件:rpm [选项] [软件包名] 常用的参数及含义如下图所示: 2.编译安装应用软件 (1).tar.gz和.tgz使用如下的命令: [root@myhost ro ...
- ref:如何在大量jar包中搜索特定字符
ref:https://www.cnblogs.com/jiangxinnju/p/5137760.html?utm_source=tuicool&utm_medium=referral 如何 ...
随机推荐
- 浅析深究什么是SOA?
浅析深究什么是SOA? http://blog.vsharing.com/fengjicheng/A1059842.html 金蝶中间件有限公司总经理 奉继承 博士 阅读提示: 本文探讨SOA概念背后 ...
- JUnit4教程-高速入口
前言 大学刚学java当听说JUnit该,单元测试框架,使用非常简单的测试框架,JUnit测试测试框架将更加方便,easy.编写測试代码也是简单.明了,功能强大.今天我给大家简单分享一下最新JUnit ...
- C++多线程分析
我们开始谈论的线程之前先看看这些线载波前-进程. 进程,它是一个正在执行的程序的实例.是一个程序在其自身的地址空间的一次执行活动.进程是资源申请.调度.和独立执行的基本单位.进程有两部分组成: 1.操 ...
- js 实现自动换行
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 【转载】Android中ListView下拉刷新的实现
在网上看到一个下拉刷新的例子,很的很棒,转载和更多的人分享学习 原文:http://blog.csdn.net/loongggdroid/article/details/9385535 ListVie ...
- .NET MVC4 实训记录之七(实现资源的自主访问后续)
我们在上一篇中讨论了如何利用ModelMetadata实现国际化资源文件访问,但也留下了一些问题,即:如何利用ModelMetadata实现相同类型的属性信息的个性化资源显示.本人没有找到合适的方案, ...
- ASP.NET MVC应用程序处理并发
为ASP.NET MVC应用程序处理并发 2014-05-14 08:37 by Bce, 694 阅读, 2 评论, 收藏, 编辑 这是微软官方教程Getting Started with Enti ...
- Effective C++(11) 自我赋值(a=a)时会发生什么?
问题聚焦: 自我赋值看似有点愚蠢的行为,其实总会发生的 首先:它是合法的, 其次,它不一定是安全的, 再次,它有时候不是那么明显. 先看一个Demo class Widget { ... }; Wid ...
- django源码阅读
最近再看django-bootstrap-toolkit,一直困惑于静态文件的路径问题.所以只能从源码入手了. 从manage.py开始.manage.py 比较简单就几句话. #!/usr/bi ...
- 事件聚合IEventAggregator和 Ihandle<T>
-事件聚合IEventAggregator和 Ihandle<T> 今天 说一下Caliburn.Micro的IEventAggregator和IHandle<T>分成两篇 ...