ini配置文件读写操作入门

2023-10-27

ini配置文件读写操作入门

        ini文件(Initialization file),这种类型的文件中通常存放的是一个程序的初始化信息。ini文件由若干个节(Section)组成,每个Section由若干键(Key)组成,每个Key可以赋相应的值。读写ini文件实际上就是读写某个的Section中相应的Key的值,而这只要借助几个函数即可完成。

ini 文件是文本文件,中间的数据格式一般为: 

[Section1 Name] 

KeyName1=value1 
KeyName2=value2 
...

[Section2 Name] 
KeyName1=value1 
KeyName2=value2

Win32 对 ini 文件操作的API中,有一部分是对 win.ini和system.ini 操作的,有一部分是对用户自定义的 ini 文件操作的。


一、对win.ini和system.ini的操作

      Win.in 和 system.ini 是Windows的两个非常重要的初始化文件,Windows将用户所作的选择以及各种变化的系统信息记录在这两个文件中。System.ini 描述了系统硬件的当前状态,Win.ini 文件则包含了Windows 系统运行环境的当前配置。由于 Win.ini 文件的重要性和常用性,Win32 中有专门对 Win.ini 进行操作的 API。

它们是:

1)GetProfileInt - 从 Win.ini 文件的某个 Section 取得一个 key 的整数值。

2)GetProfileString - 从 Win.ini 文件的某个 Section 取得一个 key 的字符串。

3)GetProfileSection - 从 Win.ini 文件中读出整个Section 的内容。

4)WriteProfileSection - 将一个整个 Section 的值写入Win.ini 文件的指定的Section 中.

5)WriteProfileString - 将一个 Key 值写入 Win.ini 文件的指定 Section 中。

      如果 Win.ini 没有指定的 Section,API 会新建 Section,如果没有指定的 Key 则新建一个 Key 并写入数据,如果已经存在,则用字符串代替原来的值。相应API接口函数的原型可以在网上查阅相关博客了解其使用情况。


二、对自定义ini文件的操作

      以上的 API是对操作系统的文件 Win.ini和system.ini的操作,当然对于我们来说,用的更多的是在程序运行的目录中建立自己的ini 文件,如果需要对自己的ini 文件操作,就要用到另一组API,这一组API和上面的类似,只要把上面一组的 Profile 换成 PrivateProfile(私有的)就可以了,参数中也相应的多了一个 ini 文件名的参数。例如 GetPrivateProfileInt、GetPrivateProfileString ,WritePrivateProfileString 等等。这里着重的介绍一下这三个API函数的原型及用法。


三、配置文件路径问题

      在对ini文件进行读写时,文件可以使相对路径或者绝对路径,用户可根据自己的需要进行选择。下面说一下相对路径和绝对路径的格式:


1)  ".\\IniFileName.ini"    // 这样的为相对路径
2) "D:\\IniFileName.ini"    // 这样的为绝对路径

       需要注意的是,C系列的语言中,转义字符'\\'表示反斜线'\'。另外,当使用相对路径时,\\前的.号不能丢掉了。

四、ini文件操作示例

1.不采用Cstring存取字符串形式

#include <iostream>  
#include <windows.h>//这个头文件一定要添加,否则GetPrivateProfileString(...)函数无法使用  
#include  "shlwapi.h" 
#pragma comment(lib, "Shlwapi")//这两个文件用于!PathFileExists函数的正常使用
int main() 
{

#ifndef CONFIG_FILE
#define CONFIG_FILE  TEXT(".\\CONFIG.ini")
	//保存的ini文件放在根目录下,不能直接保存为“CONFIG.ini”
#endif
	WritePrivateProfileString(TEXT("Teacher"), TEXT("Name"), TEXT("brother Dong "), CONFIG_FILE);
	WritePrivateProfileString(TEXT("Teacher"), TEXT("Age"), TEXT("100"), CONFIG_FILE);
	WritePrivateProfileString(TEXT("Student"), TEXT("Name1"), TEXT("Alex"), CONFIG_FILE);
	WritePrivateProfileString(TEXT("Student"), TEXT("Age1"), TEXT("23"), CONFIG_FILE);
	WritePrivateProfileString(TEXT("Student"), TEXT("Name2"), TEXT("Lauretta"), CONFIG_FILE);
	WritePrivateProfileString(TEXT("Student"), TEXT("Age2"), TEXT("21"), CONFIG_FILE);
	WritePrivateProfileString(TEXT("Student"), TEXT("Name3"), TEXT("Dudiu"), CONFIG_FILE);
	WritePrivateProfileString(TEXT("Student"), TEXT("Age3"), TEXT("21"), CONFIG_FILE);
	WritePrivateProfileString(TEXT("Others"), TEXT("Name"), TEXT("Boby"), CONFIG_FILE);
	WritePrivateProfileString(TEXT("Others"), TEXT("Age"), TEXT("12"), CONFIG_FILE);
	TCHAR szKeyValue[MAX_PATH] = { 0 };
	if (!PathFileExists(TEXT(".\\CONFIG.ini")))//判断文件是否存在
	{
		printf("ERROR");
	}
	GetPrivateProfileString(TEXT("Teacher"), TEXT("Name"), 
		TEXT("ERROR"), szKeyValue, MAX_PATH, TEXT(".\\CONFIG.ini"));//获取为字符串的键值
	printf("szKeyValue=%S\n", szKeyValue);
	int nValue = GetPrivateProfileInt(TEXT("Others"), TEXT("Age"), 0, TEXT(".\\CONFIG.ini"));//获取为整型的键值
	printf("nvalue=%d\n", nValue);
	return 0;
}

2.采用Cstring存取字符串形式

#include <iostream>  
#include <windows.h>//这个头文件一定要添加,否则GetPrivateProfileString(...)函数无法使用  
#include  "shlwapi.h" 
#include<atlstr.h>//记得包含该头文件,否则Cstring显示未定义标识符
#pragma comment(lib, "Shlwapi")//这两个文件用于!PathFileExists函数的正常使用
int main() 
{
#ifndef CONFIG_FILE
#define CONFIG_FILE  TEXT(".\\CONFIG.ini")//保存的ini文件放在根目录下,不能直接保存为“CONFIG.ini”
#endif

	WritePrivateProfileString(TEXT("Teacher"), TEXT("Name"), TEXT("brother Dong "), CONFIG_FILE);
	WritePrivateProfileString(TEXT("Teacher"), TEXT("Age"), TEXT("100"), CONFIG_FILE);
	WritePrivateProfileString(TEXT("Student"), TEXT("Name1"), TEXT("Alex"), CONFIG_FILE);
	WritePrivateProfileString(TEXT("Student"), TEXT("Age1"), TEXT("23"), CONFIG_FILE);
	WritePrivateProfileString(TEXT("Student"), TEXT("Name2"), TEXT("Lauretta"), CONFIG_FILE);
	WritePrivateProfileString(TEXT("Student"), TEXT("Age2"), TEXT("21"), CONFIG_FILE);
	WritePrivateProfileString(TEXT("Student"), TEXT("Name3"), TEXT("Dudiu"), CONFIG_FILE);
	WritePrivateProfileString(TEXT("Student"), TEXT("Age3"), TEXT("21"), CONFIG_FILE);
	WritePrivateProfileString(TEXT("Others"), TEXT("Name"), TEXT("Boby"), CONFIG_FILE);
	WritePrivateProfileString(TEXT("Others"), TEXT("Age"), TEXT("12"), CONFIG_FILE);
	if (!PathFileExists(TEXT(".\\CONFIG.ini")))
	{
		printf("ERROR");
	}
	
	CString szKeyValue;
	GetPrivateProfileString(TEXT("Teacher"), TEXT("Name"), TEXT("Error"), szKeyValue.GetBuffer(20), 20, TEXT(".\\CONFIG.ini"));
	//字符串输出方式1
	std::wcout << "szKeyValue = "<<szKeyValue.GetBuffer(0) << std::endl;
	//字符串输出方式2
	//printf("szKeyValue=%S\n", szKeyValue);
	int nValue = GetPrivateProfileInt(TEXT("Others"), TEXT("Age"), 0, TEXT(".\\CONFIG.ini"));
	printf("nvalue=%d\n", nValue);
	return 0;
}

五、注意事项

      1.读取INI时,会先从头找Section,找到后即在此Section中查找Key,要是在这个Section找不到此Key的话,即认为此Key不存在,即便此后还有同名的Section-Key定义。比如下面这个具体的例子里,使用GetPrivateProfileString则永远无法成功读取到Section1Key2。
  [Section1]
   Section1Key1=???
  [Section2]
   Section2Key1=???
  [Section1]
   Section1Key2=???    //× 永远无法找到它

     2.在非MFC下使用Cstring会导致Cstring显示为“为声明的标识符”,有如下解决办法:

1)如果你使用VC.NET,那么使用MFC,应包含:#include<cstringt.h>或者#include<afx.h>

2)不适用MFC,应包含#include<atlstr.h>

     最后想说的是,在Windows系统中,ini文件是很多,最重要的就是“System.ini”、“System32.ini”和“Win.ini”。该文件主要存放用户所做的选择以及系统的各种参数。用户可以通过修改ini文件,来改变应用程序和系统的很多配置。但自从Windows 95的退出,在Windows系统中引入了注册表的概念,ini文件在Windows系统的地位就开始不断下滑,这是因为注册表的独特优点,使应用程序和系统都把许多参数和初始化信息放进了注册表中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ini配置文件读写操作入门 的相关文章

  • 输出字符串的子串

    我们经常碰到这样一个问题 怎样快速输出一个字符串的子串 这种问题通常有两种形式 1 输出连续子串 例如 假设字符串的长度为n 其非空子串的数目为你n n 1 2个 例如字符串 abc 的连续子串有 a b c ab bc abc 利用代码实
  • ini配置文件读写操作入门

    ini配置文件读写操作入门 ini文件 Initialization file 这种类型的文件中通常存放的是一个程序的初始化信息 ini文件由若干个节 Section 组成 每个Section由若干键 Key 组成 每个Key可以赋相应的值
  • C++函数

    C 函数 函数是一组一起执行一个任务的语句 与C程序类似 每个 C 程序都至少有一个函数 即主函数 main 通过函数 还可以把一个复杂任务分解成为若干个易于解决的小任务 充分体现结构化程序设计由粗到精 逐步细化的设计思想 即将任务合理划分
  • 【C语言取反运算符】~2是多少?~-5是多少?

    标题的答案 2 3 3 2 原理是什么 我们先来看这个程序及输出的结果 容易总结出这样一个结论 i i 1 为什么呢 一言以蔽之 运算符是对i的补码 含符号位 进行取反 2的原码是0000 0010 正数补码是其本身0000 0010 取反
  • Dev C++使用简明教程

    Dev C 使用简明教程 使用高级语言编程时 我们通常使用一个集成开发环境IDE Integrated Developing Enviroment 简称IDE 来进行编辑 编译 运行和调试工作 Dev C 是一个Windows环境下C C
  • C++中的<string>头文件 和 <cstring>头文件简介

    C 中的
  • getline函数的用法

    一 getline函数的用法 getline只要一遇到换行符就结束读取操作并返回结果 哪怕一开始输入的是换行符也是如此 C 中有两个getline函数 一个是在string头文件中 定义的是一个全局的函数 函数声明是 istream get
  • 3.4 三级指针

    char p NULL 注 1 可以通过三级指针间接的改变二级指针的指向 2 p表示 三级指针指向的二级指针中保存的内存地址 3 三级指针做函数参数时 主调函数需要传2级指针的地址 4 n级指针可以间接修改n 1级指针的指向 下面的例子通过
  • 二维数组定义

    二维数组定义 1 方法一 int a new int m for int i 0 i
  • 浮点数的近似保存与计算

    这里写目录标题 负数的补码存储 十进制浮点数与二进制的转换 有限循环的二进制 无限循环的二进制 计算机对浮点数的保存 无限循环二进制数的保存 浮点数的近似 参考文献 负数的补码存储 首先我们回忆一下负数的补码表示 我们都知道 有符号数的负数
  • 【LeetCode刷题】-岛屿数量

    Task 思路 1 首先判断给定的二维数组是不是空的 2 对二维数组遍历一下 对每个元素进行判断 a 如果这个值等于1 那么就把计数器 1 并且对该元素四周进行深度搜索 3 返回 代码 class Solution public int n
  • c++学生信息管理系统(window控制台实现鼠标点击操作)

    翻起大一时写过的作业代码 一个学生信息管理系统 当时不会使用QT 不会MFC等库 只会c 但是又想做一个有界面的 能够实现鼠标操作的程序 于是绞尽脑汁查资料 自己造轮子 最终写出来了下面的这个现在连我自己也看不懂的代码 代码虽然有些长 单文
  • C++数组【修订】

    C 数组 修订 C 数组 array 是一种顺序容器sequence container 是由单一数据类型元素组成的一个有序集合 数组是用来存储一系列数据 但它往往被认为是一系列相同类型的变量 对数组元素的访问是通过下标 subscript
  • 苏小红版 c语言程序设计(第三版)系列实验题:学生成绩管理系统V5.0

    github https github com Jackie0Feng SAMS 系统需求描述 某班有最多不超过30人 具体人数由键盘输入 参加期末考试 考试科目最多不超过6门 具体门数由键盘输入 定义结构体类型 用结构体数组作函数参数编程
  • 推荐一款好用的redis客户端工具

    推荐一款好用的redis客户端工具 redis官方客户端 redis cli 每次都要指定连接IP与端口 连接成功后还要执行auth命令进行口令认证 这个过程比较繁琐 auth命令需要人工干预 不方便自动化执行redis命令 给大家推荐一款
  • android___android_log_print打印函数__源代码

    android端JNI的打印信息 include
  • C 、C++ 、Java、Python、JavaScript数据类型对比介绍

    C C Java Python JavaScript数据类型对比介绍 C C Java Python JavaScript数据类型对比如下 C语言 静态类型语言 需要在声明变量时指定类型 基本数据类型包括 整型 int 通常分为有符号 si
  • Windows中使用GCC介绍

    Windows中使用GCC介绍 GCC介绍 GCC是由许多组件组成的 GCC原名为GNU C语言编译器 GNU C Compiler 只能处理C语言 但其很快扩展 变得可处理C 后来又扩展为能够支持更多编程语言 如Fortran Pasca
  • 递推和递归、迭代的关系简介

    递推和递归 迭代的关系简介 在编程里 递推关系可以通过递归或者迭代来实现 但是递归和迭代又不仅仅只能用来实现递推关 有更广泛的用途 递推 递归和迭代都是解决问题的方法 它们之间有一定的联系 递归和迭代可以用于实现递推关系 但它们也有各自独立
  • C++程序的基本组成简介

    C 程序的基本组成简介 C 程序的基本组成 这个C 程序例子 由一个程序单位 程序文件 注 组成 这是一个简单例子未使用类 注 其中包括 1 头文件 可以认为头文件是你在调用函数时的一个桥梁 格式为 include 引用文件名 c 的程序是

随机推荐

  • 微信小程序开发架构——JavaScript的基本概述 和 JavaScript在 Nodejs、小程序中、浏览器中的使用方法

    轻量 是指在入门JavaScript语言时候觉得JavaScript 没有其它语言学习起来那么重 解释性 是指所编写的JavaScript语言它在运行时 机器会把JavaScript语言翻译成机器语言 JavaScript语法接近于Java
  • 数字图像字符识别——数字识别

    本文简单介绍图片字符识别的原理 主要识别图片中的数字 其他字符识别原理类似 大家应该知道 对于人类来说 可以很容易理解一张图片所表达的信息 这是人类视觉系统数万年演变进化的结果 但对于计算机这个诞生进化不到百年的 新星 要让它理解一张图像上
  • 如何从头手写一个富文本编辑器(解析slate源码,连载)

    背景 最近文档很火 老板也要 我也很感兴趣 于是入坑学习实践了一番 一眨眼就是一年过去了 项目初见成效 但是发现困难和挑战也越来越棘手 于是深入研究改编了一下源码 为后面重写源码做准备 我们的项目的成果截图 镇宅一下 文章末尾有demo源码
  • 聊聊2017 OWASP Top 10

    关于OWASP Top10 OWASP项目最具权威的就是其 十大安全漏洞列表 OWASPTop 10 OWASP Top 10不是官方文档或标准 而只是一个被广泛采用的意识文档 被用来分类网络安全漏洞的严重程度 目前被许多漏洞奖励平台和企业
  • moduleName is declared but its value is never read.ts(6133)报错解析

    问题重现 当使用ts语法导入第三方库时 比如koa模块 这时会发现出现这个错误 这个错误因为没有默认导出 问题原因 一般我们使用ts导入其他模块时都会有一个声明文件 不明白可以看我另外一篇 博客 我们进入声明文件中可以发现模块是通过expo
  • 使用Easyexcel对Excel进行读写操作

    1 概述 EasyExcel是一个基于Java的简单 省内存的读写Excel的开源项目 在尽可能节约内存的情况下支持读写百M的Excel github地址 GitHub alibaba easyexcel 快速 简洁 解决大文件内存溢出的j
  • ES6模块

    项目目录 node modules package json server js public index html index js math js babelrc dist 搭建验证环境 npm init y npm install s
  • 小程序中使用for循环,并动态添加class

    前言 小程序中使用for循环 并动态添加class 实现效果 实现代码 index wxml中
  • 考研高数数二 一元函数积分学内容框架

    完整的思维导图链接 https zhimap com m NojzfjkC
  • 第46讲 Android Camera2 API AWB自动白平衡

    本讲是Android Camera专题系列的第46讲 我们介绍Android Camera2 API专题的AWB自动白平衡 包括如下内容 为什么要做白平衡 什么是自动白平衡 Android Camera颜色处理流程 AWB模式 AWB Lo
  • Java运算符优先级顺序

    Java运算符优先级顺序 图集说明 1 算数运算符 补充两个 单目运算符 正号 10 10 单目运算符 负号 n 10 n 10 1 除法规则 若两个操作数都是整型 结果也是整型 除数不能为0 若两个操作数有一个是浮点型 结果是浮点型 Sy
  • python爬虫十三:详细了解scrapy

    1 Scrapy log信息的认知 2019 01 19 09 50 48 scrapy utils log INFO Scrapy 1 5 1 started bot tencent 2019 01 19 09 50 48 scrapy
  • Matlab安装 MinGW-w64 编译器的方法

    最近用Matlab实现机器学习算法 学习到支持向量机时 提示需要运行lib svm包需要安装 MinGW w64 C 编译器 在这里把步骤列一下 1 下载MinGW w64 C 编译器 点击下载 安装时注意选择32位还是64位的 1 安装时
  • Windows混音器API使用

    1 首先用mixerGetNumDevs 函数获取系统中的混音器设备的数量 一般 机器上都至少有一个混音器设备 声卡 如果机器上没有连接其它的音频设备 那么也就只有声卡这一个混音器设备 我的机器上接有一个名为USB EMP Audio De
  • go-redis 框架基本使用

    文章目录 redis使用场景 下载框架和连接redis 1 安装go redis 2 连接redis 字符串操作 有序集合操作 流水线 事务 1 普通事务 2 Watch redis使用场景 缓存系统 减轻主数据库 MySQL 的压力 计数
  • 自适应控制设计(二)

    自适应控制设计 二 自适应控制基本思想 一文主要介绍了自适应控制设计的基本思路 但是针对控制率的设计没有具体说明 这里针对反馈控制率的设计步骤进行具体介绍 控制器设计基本思想 对于任何一个动态系统 我们都可以根据Lyapunov稳定性设计其
  • C++MFC编程之按钮控件Button、Radio Button和Check Box

    钮控件包括命令按钮 Button 单选按钮 Radio Button 和复选框 Check Box 等 命令按钮就是我们前面多次提到的狭义的按钮控件 用来响应用户的鼠标单击操作 进行相应的处理 它可以显示文本也可以嵌入位图 单选按钮使用时
  • 解决el-select下拉框多选在赋完值之后,不能对tag和已选中的值取消掉

    这种是原先的写法
  • 如何在Linux环境创建GRE Tunnel

    Question I want to connect to remote networks by using a GRE tunnel How can I create a GRE tunnel between two end points
  • ini配置文件读写操作入门

    ini配置文件读写操作入门 ini文件 Initialization file 这种类型的文件中通常存放的是一个程序的初始化信息 ini文件由若干个节 Section 组成 每个Section由若干键 Key 组成 每个Key可以赋相应的值