linux C 修改文本文件中指定行的内容

1、可随意修改内容

/*
 * Author:aniu12<gdzengxiong@gmail.com>
 * Date: 2014.02.13
  */
#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};
    char save[100][512];
    memset(save, 0, sizeof(save));

	int line_len = 0;
	int len = 0;
	int res;
    int i=0;
    int j=0;
	int k=0;
                                
	/*
	 * cc.cfg是文件名,r+代表可以读写文件
	  */
	FILE *fp = fopen("test.txt", "r+");
	if(fp == NULL)
	{
		printf("open error");
		return -1;
	}

	/*
	  *   复制文件内容到缓存数组save[][]中	
	  */
	while(fgets(save[i], 512, fp))
	{
        i++;
    	}

   fseek(fp,0,SEEK_SET);
	while(fgets(linebuffer, 512, fp))
	{
		k++;
		/*
		 *  在文件中查找符合条件的那一行内容,并记录当前行数
		 */
		sscanf(linebuffer, "%[^=]=%[^=]", buffer1,buffer2);
		if(!strcmp("wireless.1.current_state", buffer1))
		{
			k--;
            break;
		}
	}
	
        /*
	  *   将要修改的内容写入缓存中
	  */
	strcpy(buffer2, "=311\0");
	strcat(buffer1, buffer2);
    buffer1[strlen(buffer1)]='\n';
	printf("%d\n",strlen(buffer1));
	printf("%s\n",buffer1);
    memset(save[k], 0, 512);
	strncpy(save[k],buffer1,512);

	/*
	  *   清空文件内容
	  */
    fseek(fp,0,SEEK_SET);
    truncate("./test.txt",0);//clean test.txt

	/*
	  *   将缓存中的数据按行写入文件中
	  */
    fseek(fp,0,SEEK_SET);
    for(j=0;j<i;j++)
   	 {
        fwrite(save[j],strlen(save[j]),1,fp);
    	  }
    fclose(fp);
	 return 0;

}


2、Shell中sed命令的C语言实现

 

 /*
 * Author:aniu12<gdzengxiong@gmail.com>
 * Date: 2013.02.13
  */
#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};
    char save[100][512];
    memset(save, 0, sizeof(save));

	int line_len = 0;
	int len = 0;
	int res;
    int i=0;
    int j=0;
                                
	/*
	* cc.cfg是文件名,r+代表可以读写文件
	*/
	FILE *fp = fopen("test.txt", "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;
			}
            //memset(buffer2,0,sizeof(buffer2));
			strcpy(buffer2, "=311");
			/*strcat(buffer1, "=");*/
			strcat(buffer1, buffer2);
			printf("%d\n",strlen(buffer1));
			/*
			  * 写文件,存入所需的内容
			  */
			fprintf(fp, "%s", buffer1);        
			fclose(fp);
			return;
		}
	}
	return 0;
}

3、C 语言读写配置文件

/*
 * File: read and write ConfigFile
 * Author:aniu12<gdzengxiong@gmail.com>
 * Date: 2014.02.13
 */
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>

#define FILE_NAME   "./sound.ini"
#define READ_MODE   "r+"
#define BUFFER_SIZE 38
#define BUFFER_NUM  2
#define SPK_KW      "spk"
#define MIC_KW      "mic"

int Write_Line_Data ( char *path, int data, unsigned char *keyword )
{

        /*
    *linebuffer:读取文件中的一行存入的缓冲
    *buffer1:一行中第一个字段的存入缓冲
    *buffer2:一行中第二个字段的存入缓冲
         */
	char linebuffer[BUFFER_SIZE] = {0};
	char buffer1[BUFFER_SIZE] = {0};
	char buffer2[BUFFER_SIZE] = {0};
    char save[BUFFER_NUM][BUFFER_SIZE];
    int i=0;
    int j=0;
	int k=0;
                                
    memset ( save, 0, sizeof(save) );
	
    /*
	 * FILE_NAME是文件名,r+代表可以读写文件
	  */
	FILE *fp = fopen ( path, READ_MODE );
	if ( fp == NULL )
	{
		printf ( "open error" );
		return -1;
	}

	/*
	  *   复制文件内容到缓存数组save[][]中	
	  */
	while ( fgets(save[i], BUFFER_SIZE, fp) )
	{
        i++;
  	}

    fseek ( fp,0,SEEK_SET );//重新定位到文件开始处
	while(fgets(linebuffer, BUFFER_SIZE, fp))
	{
		k++;
		/*
		 *  在文件中查找符合条件的那一行内容,并记录当前行数
		 */
		sscanf ( linebuffer, "%[^=]=%[^=]", buffer1, buffer2 );
		if ( !strcmp (keyword, buffer1) )
		{
			k--;
            break;
		}
	}
	
     /*
	  *   将要修改的内容写入缓存中
	  */
    sprintf ( buffer2, "%d", data );//将整数转换成字符串
    buffer2[strlen(buffer2)] = '\n';
    buffer1[strlen(buffer1)] = '=';
	strcat(buffer1, buffer2);
	strncpy(save[k],buffer1,BUFFER_SIZE);

	/*
	 *   清空文件内容
     */
    fseek(fp,0,SEEK_SET);
    truncate("./test.txt",0);//clean test.txt

	/*
	 *   将缓存中的数据按行写入文件中
	 */
    fseek(fp,0,SEEK_SET);
    for(j=0;j<i;j++)
   	{
        fwrite(save[j],strlen(save[j]),1,fp);
    }
    
    fclose(fp);
	return 0;
}

void String_Isdigit(char *src, char *dst)
{
    int i = 0;
    while ( src[i] != '\0' )
    {
        if (isdigit(src[i]))
            dst[i] = src[i];
        else dst[i] = ' ';
        ++i;
    }
    dst[i] = '\0';
} 

int Read_Line_Data ( char *path, int data, char *keyword )
{

    /*
     *linebuffer:读取文件中的一行存入的缓冲
     *buffer1:一行中第一个字段的存入缓冲
     *buffer2:一行中第二个字段的存入缓冲
     */
	char linebuffer[BUFFER_SIZE] = {0};
	char buffer1[BUFFER_SIZE] = {0};
	char buffer2[BUFFER_SIZE] = {0};
	
    /*
	 * FILE_NAME是文件名,r+代表可以读写文件
	  */
	FILE *fp = fopen(path, READ_MODE);
	if ( fp == NULL )
	{
		printf ( "open error" );
		return -1;
	}

	while(fgets(linebuffer, BUFFER_SIZE, fp))
	{
		/*
		 *  在文件中查找符合条件的那一行内容
		 */
		sscanf ( linebuffer, "%[^=]=%[^=]", buffer1, buffer2 );
		if ( !strcmp (keyword, buffer1) )
		{
            break;
		}
	}
	
     /*
	  *   将要修改的内容写入缓存中
	  */
	memset ( buffer1, 0, sizeof(buffer1) );
    String_Isdigit (buffer2,buffer1 );
    sscanf ( buffer1, "%d", &data );
	printf("%s=%d\n", keyword,  data);
    
    fclose(fp);
	return 0;
}


int main ( int argc, char **argv )
{
    int mic_data = 0;
    int spk_data = 0;

    if ( argc <3 )
    {
        printf("It need 3 params!\n");
        return -1;
    }
    
    mic_data = atoi ( argv[2] );
    spk_data = atoi ( argv[1] );

    Write_Line_Data ( FILE_NAME, spk_data, SPK_KW );
    Write_Line_Data ( FILE_NAME, mic_data, MIC_KW );

	Read_Line_Data ( FILE_NAME, spk_data, SPK_KW );
    Read_Line_Data ( FILE_NAME, mic_data, MIC_KW );

    return 0;
}

sound.ini

spk=122
mic=335



  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值