例如 —— 配置文件的格式如下:

./net.conf 的文件的内容为

IP=192.168.1.20 
MASK=255.255.255.0

DNS=192.168.1.1

(要把IP的值进行修改)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <stdint.h>#define STR_NETWORKCFG_FILE "./net.conf"struct info_t{char name[20];char data[60];
};
int GetFile_Info(char *name,char *result)
{char linebuffer[100] = {0};char buffer1[100] = {0};char buffer2[100] = {0};uint8_t flag = 0;int buffer_size=0;FILE *fp = fopen(STR_NETWORKCFG_FILE, "r");if(fp == NULL){printf("open error");return 1;}while(1){char *ret = fgets(linebuffer, 100, fp);if(ret == NULL){break;}sscanf(linebuffer, "%[^=]=%[^=]", buffer1,buffer2);printf("%s",linebuffer);printf("\n**\n");if(!strcmp(name, buffer1)){buffer_size=strlen(buffer2);memcpy(result,buffer2,buffer_size);result[buffer_size-1]='\0';//remove the \nflag = 1;break;}memset(buffer1,0,sizeof(buffer1));memset(buffer2,0,sizeof(buffer2));memset(linebuffer,0,sizeof(linebuffer));}fclose(fp);if(flag != 1)return 1;return 0;
}/*获取所有文件信息,存入结构体中,遇到需修改的字段,修改后存入结构体,后再全部重新写入保存*/
int ChangeFile_Info(char *name,char *writedata)
{int i;uint8_t flag = 0,cnt = 0;struct info_t info[12];char linebuffer[256] = {0};char buffer[80];FILE *fp = fopen(STR_NETWORKCFG_FILE, "r");if(fp == NULL){printf("open error");return 1;}for(i = 0 ; i < 12 ; i++){char *ret = fgets(linebuffer, 256, fp);if(ret == NULL){break;}sscanf(linebuffer, "%[^=]=%[^=]", info[i].name,info[i].data);if(!strcmp(info[i].name, name)){memcpy(info[i].data,writedata,strlen(writedata));info[i].data[strlen(writedata)] = '\n';info[i].data[strlen(writedata)+1] = '\0';flag = 1;}memset(linebuffer,0,sizeof(linebuffer));cnt++;}fclose(fp);if(flag){fp = fopen(STR_NETWORKCFG_FILE,"w");if(fp == NULL){return 1;}for(i = 0 ; i < cnt ; i++){memset(buffer,0,sizeof(buffer));sprintf(buffer,"%s=%s",info[i].name,info[i].data);fprintf(fp,"%s",buffer);}fclose(fp);}elsereturn 1;return 0;
}int main()
{char result[100] = {0};char *writedata = "192.168.12.33";GetFile_Info("IP",result);printf("result:%s\n",result);ChangeFile_Info("IP",writedata);GetFile_Info("IP",result);printf("result:%s\n",result);return 0;
}

******************************************相关问题****************************************

******************************************************************************************

问题 1、代码中的  %[^=]=%[^=]     什么意思???             c++中%[^,]是什么意思?

一般我们是scanf("%s", xxxx),有时我们希望空格也输入进去,可以用scanf("%[^\n]", xxxx)%[^\n]的意思就是以'\n'作为输入的结束标志。同理%[^,]就是以','做输入的结束标志。其它的如%[a-z] 表示匹配a到z中任意字符%[aB'] 匹配a、B、'中一员%[^a] 匹配非a的任意字符 
问题 2 、当配置文件的格式转化为

IP  192.168.1.20

MASK  255.255.255.0

DNS   192.168.1.1

以上的正则应该写成     %[^ ]  %[^ ]

当DNS 与 192.168.1.1 之间存在 \t时候,正则应该写成: %[^  \t]   %[^  \t]

**********************************工作中遇到的一个问题*******************************************

*******************************************************************************************************

问题描述:

读取配置文件中的键值对,配置文件如下所示(over.conf文件):

#IP    10.33

MASK            255.255.255.0
DNS 192.168.1.1

*篇日志文件中有第一行有注释;第二行有一个空行;第三行开头有空格 tab,键值对之间有空格 tab*

要求是,若某行配置文件被注释掉,不做操作;读出来的“IP” 要与 “ip”进行匹配,即要进行大小写字符转换;配置文件中有空格、还有tab匹配字符时候要考虑多种情况;配置文件每行开头或者结尾有tab或者有空格。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <stdint.h>#define STR_NETWORKCFG_FILE "./over.conf"//去掉字符串 开头 与结尾 的空格 '\t'
void trim(char *strIn, char *strOut){int i, j ;i = 0;j = strlen(strIn) - 1;while(strIn[i] == ' ' || strIn[i] == '\t')++i;while(strIn[j] == ' ' || strIn[j] == '\t')--j;strncpy(strOut, strIn + i , j - i + 1);strOut[j - i + 1] = '\0';
}/*获取指定字段(name)信息存入result中*/
int GetFile_Info(char *name,char *result)
{char linebufferOld[100];char linebuffer[100];char buffer1[100] = {0};char buffer2[100] = {0};uint8_t flag = 0;int buffer_size=0;FILE *fp = fopen(STR_NETWORKCFG_FILE, "r");if(fp == NULL){printf("open error");return 1;}while(1){char *ret = fgets(linebufferOld, 100, fp);if(ret == NULL){break;}//解决配置文件 每行首位有空格或者tab的问题trim(linebufferOld,linebuffer);//解决配置文件 取键值时候 两个值中间有 空格或者tab sscanf(linebuffer, "%[^ \t] \t%[^ \t]", buffer1,buffer2);if(!strcmp(name, buffer1)){buffer_size=strlen(buffer2);memcpy(result,buffer2,buffer_size);result[buffer_size-1]='\0';//remove the \nflag = 1;break;}memset(buffer1,0,sizeof(buffer1));memset(buffer2,0,sizeof(buffer2));memset(linebuffer,0,sizeof(linebuffer));}fclose(fp);if(flag != 1)return 1;return 0;
}int main()
{char result[100] = {0};FILE *fp = NULL;char buff[100];char temp[255];char tem[255];char *res = NULL;int i;char *ch = "IP";char *ptr,c = '#';fp = fopen(STR_NETWORKCFG_FILE, "r");if(fp == NULL){perror("This file is not exit!\n");return -1;}while(fgets(buff,100,fp) != NULL){//len=strlen(buff);//printf("%s %d\n",buff,len-1);printf("buff  ==== %s\n",buff);strcpy(temp,buff);//printf("temp  ==== %s\n",temp);//判断配置文件中有无空行(其除去前后空格 tab后长度是1 则为空行 退出程序)trim(temp,tem);if(strlen(tem) == 1)continue;ptr = strchr(buff,c);//判断此行是否有注释 是否有“#”字符if(ptr){printf("the character %c is at :%s\n",c,ptr);continue;}else{res = strtok(temp," \t");printf("键res为 ==== *%s*\n",res);GetFile_Info(res,result);printf("值result为 === %s\n",result);}//被分割后的字符串temp现在是大写 在后续的程序中需要小写//因此在此处需要转换for(i;i<strlen(temp);i++){if(temp[i] < 'a'){temp[i] += 32;}}printf("最终的键%s 值%s\n",res,result);if(!strcmp("mask",res)){printf("aaaaaaaaaa\n");}else{printf("bbbbbbbbbb\n");}printf("\n\n");}fclose(fp);return 0;
}~                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  

获取键值对值时候,可以在一行一行读取文件之后,用sscanf()函数,直接获取响应的键值。(后续会补充)

读文件 —— 读写配置文件相关推荐

  1. .dat文件写入byte类型数组_Go语言学习基础-读文件、写文件、行过滤器

    Reading File 读文件 读写文件是许多Go程序所需的基本任务.首先,我们将看一些读取文件的示例.读取文件需要检查是否出现调用错误. 最基本的文件读取任务是将文件的全部内容读到内存中iouti ...

  2. 【C 语言】文件操作 ( 配置文件读写 | 业务逻辑 | 接口设计 )

    文章目录 一.配置文件读写 业务逻辑 二.接口设计 1.写文件接口 2.读文件接口 3.修改文件接口 4.接口合并 一.配置文件读写 业务逻辑 开发一个系统 , 在命令行中实现如下功能 , 通过命令操 ...

  3. python读文件写文件-python 文件读写操作

    读文件 打开一个文件用open()方法(open()返回一个文件对象,它是可迭代的): >>> f = open('test.txt', 'r') r表示是文本文件,rb是二进制文件 ...

  4. python中文件读写位置的作用-python配置文件的读写

    1. 配置文件configuration file python中的配置文件有.conf..ini..cfg..txt等多种,其中.ini最常见 .ini文件是Initialization File的 ...

  5. python写文件读文件-Python 实例:读写文件

    原标题:Python 实例:读写文件 读写文件是最常见的IO操作.内置了读写文件的函数,用法和的读写文件非常类似.在磁盘上读写文件的功能都是由提供的,现代不允许普通的程序直接操作磁盘,所以,读写文件就 ...

  6. 编程中python怎么读-python之文件读写

    本节内容: I/O操作概述 文件读写实现原理与操作步骤 文件打开模式 Python文件操作步骤示例 Python文件读取相关方法 文件读写与字符编码 一.I/O操作概述 I/O在计算机中是指Input ...

  7. python文件对象提供了3个读方法、分别是-python3 IO编程:文件读写

    打开文件对象 在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序直接操作磁盘,所以,读写文件就是请求操作系统打开一个文件对象(通常称为文件描述符),然后,通过操作系统提供的接口从 ...

  8. python写文件读文件-Python 读写文件和file对象的方法(推荐)

    1.open 使用open打开文件后一定要记得调用文件对象的close()方法.比如可以用try/finally语句来确保最后能关闭文件. file_object = open('thefile.tx ...

  9. 【C 语言】文件操作 ( 配置文件读写 | 写出或更新配置文件 | 追加键值对数据 | 更新键值对数据 )

    文章目录 一.追加键值对数据 二.更新键值对数据 三.完整代码示例 一.追加键值对数据 在上一篇博客 [C 语言]文件操作 ( 配置文件读写 | 写出或更新配置文件 | 逐行遍历文件文本数据 | 获取 ...

最新文章

  1. SELECT INTO 和 replace into SELECT 两种表复制语句
  2. install命令和cp命令的区别
  3. POJ2777 Count Color 线段树区间更新
  4. python中的try...except...finally函数
  5. GNU make manual 翻译( 一百零九)
  6. JavaFX场景切换代码示例
  7. ubuntu14.04 LTS 源码编译安装postgreSQL
  8. 西门子cpu指示灯含义_西门子S7200仿真软件如何使用?
  9. 【COCOS CREATOR 系列教程之二】脚本开发篇事件监听、常用函数等示例整合
  10. GitHub开源项目:用于构建接入网络和模块化网络服务的平台
  11. hbase工作 架构原理
  12. shell sort 最后一列排序_算法实现系列(1)—— 排序算法
  13. 2021年软考+BGP邻居实验
  14. java 打牌游戏_java代码-----实现4个人打牌游戏的相关代码。线程
  15. 提升SQLite数据插入效率低、速度慢的方法
  16. 大数据软件在高校领域的应用探索—智慧高校解决方案分享
  17. 电梯监控系统的服务器,电梯安全远程监控系统方案整理
  18. 如何掌握电烙铁焊接技术
  19. Scrapy框架流程图解析
  20. 认识蜂鸣器和声音奥秘

热门文章

  1. libevent在windows下使用步骤详解
  2. acme自动证书申请
  3. elk7.2+filebeat
  4. 机器学习技法1-Linear Support Vector Machine
  5. 20155308 《信息安全系统设计基础》课程总结
  6. 我的学习之路_第二十三章_HTML
  7. moss2007 权限体系分析(深入到数据库结构的分析)
  8. leetcode算法题--删除回文子序列
  9. DPDK加速I/O虚拟化
  10. string 替换_vim怎么查找与替换文字?比Windows记事本效率高太多了