Linux c 配置文件读取与修改

本文档提供了一个修正过的C程序示例,用于读取和修改Linux环境下的配置文件,如configure.cfg。程序确保正确处理配置文件,帮助初学者理解如何在C语言中操作文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

修改自某新手的有BUG的程序,新建个配置文件configure.cfg在当前目录,然后,然后复制代码去感受下吧

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

/* 
 *从配置文件中读取相应的值 
 *输入参数:1,配置文件路径 2,匹配标记 ,返回读取的变量 
 *并且排除了空行,“=”前后无内容,无“=”的情况 
 */ 
char * ReadConfig(char *conf_path,char *conf_name) 
{ 
	char *config_buff;
	char config_linebuf[256]; 
	char line_name[40]; 
	char exchange_buf[256]; 
	char *config_sign = "="; 
	char *leave_line; 
    	FILE *f; 
    f = fopen(conf_path,"rw"); 
if(f == NULL) 
    { 
        printf("Open configure file fail!\n"); 
	return 0; 
 } 
    fseek(f,0,SEEK_SET);  
	while(fgets(config_linebuf,256,f) != NULL) 
    	{    
	if(strlen(config_linebuf) < 3) //判断是否是空行 
        { 
		continue; 
        } 
	if (config_linebuf[strlen(config_linebuf)-1] == 10) //去除最后一位是\n的情况 
        { 

            memset(exchange_buf,0,sizeof(exchange_buf)); 
            strncpy(exchange_buf,config_linebuf,strlen(config_linebuf)-1); 
            memset(config_linebuf,0,sizeof(config_linebuf)); 
            strcpy(config_linebuf,exchange_buf); 
        } 
        memset(line_name,0,sizeof(line_name)); 
        leave_line = strstr(config_linebuf,config_sign); 
	if(leave_line == NULL)                            //去除无"="的情况 
        { 
	continue; 
        } 
int leave_num = leave_line - config_linebuf; 
        strncpy(line_name,config_linebuf,leave_num); 
if(strcmp(line_name,conf_name) ==0) 
        { 
            strncpy(config_buff,config_linebuf+(leave_num+1),strlen(config_linebuf)-1);
            break; 
        } 
if(fgetc(f)==EOF) 
        { 
break;   
        } 
        fseek(f,-1,SEEK_CUR); 
        memset(config_linebuf,0,sizeof(config_linebuf)); 
    } 
    fclose(f); 
	return config_buff;
} 


/* 
 *添加修改文件(当配置文件中存在标记字段,则进行修改,若不存在则进行添加) 
 * 
 *输入参数:1,配置文件路径 2,匹配标记 3,替换或添加的内容 
 * 
 */ 
AddOrAltConfig(char *conf_path,char *conf_name,char *config_buff) 
{ 
	char config_linebuf[256]; 
	char line_name[40]; 
	char *config_sign = "="; 
	char *leave_line; 
	int  alter_sign = 0; 

    	FILE *f; 
    f = fopen(conf_path,"r+"); 
if(f == NULL) 
    { 
        printf("Open configure fail!\n"); 
	return 0; 
    } 
    fseek(f,0,SEEK_END); 
long congig_lenth = ftell(f); 
int configbuf_lenth = strlen(config_buff); 
    configbuf_lenth = configbuf_lenth + 5; 
char sum_buf[congig_lenth+configbuf_lenth]; 
    memset(sum_buf,0,sizeof(sum_buf)); 
    fseek(f,0,SEEK_SET);  
while(fgets(config_linebuf,256,f) != NULL) 
    {    
if(strlen(config_linebuf) < 3) //判断是否是空行 
        { 
            strcat(sum_buf,config_linebuf); 
continue; 
        } 
        leave_line = NULL; 
        leave_line = strstr(config_linebuf,config_sign); 
if(leave_line == NULL)                            //去除无"="的情况 
        { 
            strcat(sum_buf,config_linebuf); 
continue; 
        } 
int leave_num = leave_line - config_linebuf; 
        memset(line_name,0,sizeof(line_name)); 
        strncpy(line_name,config_linebuf,leave_num); 
if(strcmp(line_name,conf_name) ==0) 
        { 
	    strcat(sum_buf,conf_name);
	    strcat(sum_buf,"=");
            strcat(sum_buf,config_buff); 
            strcat(sum_buf,"\n"); 
            alter_sign = 1; 
        } 
else 
        { 
            strcat(sum_buf,config_linebuf); 
        } 
if(fgetc(f)==EOF) 
        { 
break;   
        } 
        fseek(f,-1,SEEK_CUR); 
        memset(config_linebuf,0,sizeof(config_linebuf)); 
    } 
if(alter_sign == 0) 
    { 
        strcat(sum_buf,config_buff); 
        strcat(sum_buf,"\n"); 
    } 
    printf("---configure---->\n%s<----------\n",sum_buf); 
    remove(conf_path); 
    fclose(f); 
    FILE *fp; 
    fp = fopen(conf_path,"w+"); 
if(fp == NULL) 
    { 
        printf("Open configure fail!\n"); 
	return 2; 
    } 
    fseek(fp,0,SEEK_SET); 
    fputs(sum_buf,fp); 
    fclose(fp); 
} 

int main(void)
{
	char* data;
	char* file = "./configure.cfg";
	data = ReadConfig(file,"id");
	printf("id = %s\n",data);
	AddOrAltConfig(file,"id","678");


}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lclitlife

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值