• 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


    实现原理:

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

  • 相关阅读:
    并发编程的艺术
    Redis字符串实现,SDS与C的区别,空间预分配
    Jvm
    Redis数据结构的实现
    发一篇感谢身边的所有从事it工作的朋友
    BeanFactory 默认的注入实现类DefaultListableBeanFactory
    jsSwitch语句优化
    彻底搞懂 Nginx 的五大应用场景
    Spring Boot 整合 Quartz 轻松实现任务调度!
    js计算两个给定日期之间的天数
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3155538.html
Copyright © 2020-2023  润新知