ini配置文件
- 格式:doc
- 大小:40.50 KB
- 文档页数:5
C语⾔读取写⼊ini配置⽂件的⽅法实现⽬录⼀、了解什么是INI⽂件?⼆、INI⽂件的格式三、解析上述⽂件四、测试如下⼀、了解什么是INI⽂件?ini ⽂件是Initialization File的缩写,即初始化⽂件,这是⽤来配置应⽤软件以实现不同⽤户的要求。
⼆、INI⽂件的格式INI⽂件由节、键、值组成。
⼀个简单的的INI⽂件例⼦如下:[Setting]INIT_FLAG=0;VOLUME=1;LANGUAGE=1;如上例⼦,[Setting]就是节,=号左边的值是键,=号右边的是值。
三、解析上述⽂件/*ini.h*/#ifndef INI_H#define INI_H#include <stdio.h>#include <string.h>int GetIniKeyString(char *title,char *key,char *filename,char *buf);int PutIniKeyString(char *title,char *key,char *val,char *filename);#endif /*INI_H*//*ini.c*/#include <stdio.h>#include <string.h>/** 函数名: GetIniKeyString* ⼊⼝参数: title* 配置⽂件中⼀组数据的标识* key* 这组数据中要读出的值的标识* filename* 要读取的⽂件路径* 返回值:找到需要查的值则返回正确结果 0* 否则返回-1*/int GetIniKeyString(char *title,char *key,char *filename,char *buf){FILE *fp;int flag = 0;char sTitle[64], *wTmp;char sLine[1024];sprintf(sTitle, "[%s]", title);if(NULL == (fp = fopen(filename, "r"))) {perror("fopen");return -1;}while (NULL != fgets(sLine, 1024, fp)) {// 这是注释⾏if (0 == strncmp("//", sLine, 2)) continue;if ('#' == sLine[0]) continue;wTmp = strchr(sLine, '=');if ((NULL != wTmp) && (1 == flag)) {if (0 == strncmp(key, sLine, strlen(key))) { // 长度依⽂件读取的为准sLine[strlen(sLine) - 1] = '\0';fclose(fp);while(*(wTmp + 1) == ' '){wTmp++;}strcpy(buf,wTmp + 1);return 0;}} else {if (0 == strncmp(sTitle, sLine, strlen(sTitle))) { // 长度依⽂件读取的为准flag = 1; // 找到标题位置}}}fclose(fp);return -1;}/** 函数名: PutIniKeyString* ⼊⼝参数: title* 配置⽂件中⼀组数据的标识* key* 这组数据中要读出的值的标识* val* 更改后的值* filename* 要读取的⽂件路径* 返回值:成功返回 0* 否则返回 -1*/int PutIniKeyString(char *title,char *key,char *val,char *filename){FILE *fpr, *fpw;int flag = 0;char sLine[1024], sTitle[32], *wTmp;sprintf(sTitle, "[%s]", title);if (NULL == (fpr = fopen(filename, "r")))return -1;// 读取原⽂件sprintf(sLine, "%s.tmp", filename);if (NULL == (fpw = fopen(sLine, "w")))return -1;// 写⼊临时⽂件while (NULL != fgets(sLine, 1024, fpr)) {if (2 != flag) { // 如果找到要修改的那⼀⾏,则不会执⾏内部的操作wTmp = strchr(sLine, '=');if ((NULL != wTmp) && (1 == flag)) {if (0 == strncmp(key, sLine, strlen(key))) { // 长度依⽂件读取的为准flag = 2;// 更改值,⽅便写⼊⽂件sprintf(wTmp + 1, " %s\n", val);}} else {if (0 == strncmp(sTitle, sLine, strlen(sTitle))) { // 长度依⽂件读取的为准flag = 1; // 找到标题位置}}}fputs(sLine, fpw); // 写⼊临时⽂件}fclose(fpr);fclose(fpw);sprintf(sLine, "%s.tmp", filename);return rename(sLine, filename);// 将临时⽂件更新到原⽂件}上述两个函数是简单的解析函数,因为ini⽂件有很多种解析⽅式,根据不同的需求解析也不同所以要进⾏修改⽐如我的注释符号是 “ ;”,所以我需要修改并且根据实际功能需求也可以进⾏进⼀步的封装四、测试如下ini样本⽂件/*test.ini*/[city]beijing = hello-beijingshanghai = hello-shanghai#information[study]highschool = xxxxuniversity = yyyytest.c程序/*test.c*/#include "ini.h"#include <stdio.h>int main(int argc, char const *argv[]){char buff[100];int ret;ret = GetIniKeyString("city","beijing","./test.ini",buff);printf("ret:%d,%s\n",ret,buff);ret = GetIniKeyString("study","highschool","./test.ini",buff);printf("ret:%d,%s\n",ret,buff);ret = PutIniKeyString("study","highschool","zzzz","./test.ini");printf("put ret:%d\n",ret);ret = GetIniKeyString("study","highschool","./test.ini",buff);printf("ret:%d,%s\n",ret,buff);return 0;}结果如下:ret:0,hello-beijingret:0,xxxxput ret:0ret:0,zzzz相应的test.ini的study段highschool项变成了zzzz.这⾥还要注意,section使⽤中⽂字符可能会⽆法识别!到此这篇关于C语⾔读取写⼊ini配置⽂件的⽅法实现的⽂章就介绍到这了,更多相关C语⾔读取写⼊ini 内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。
详解Desktop.ini配置设置文件1㈠、INI文件是什么Desktop.ini是什么呢?首先,他是一种特殊的.ini文件。
那么.ini文件是什么呢?配置设置文件!所以,Desktop.ini是一种特殊的,用来自定义文件夹相关信息的配置文件。
默认情况下,他由系统创建,存在于该文件夹下,并具有系统、隐藏属性。
.INI文件是一种具有特定格式的纯文本文件。
Windows利用扩展名为.INI的文件保存Windows 及其应用程序的初始化信息。
Windows 及其应用程序每次启动时,都会从相应的.INI文件中读取初始化设置信息,并据此进行配置。
㈡、INF文件的格式简介以下示例为“我的电脑”中的Desktop.ini配置设置文件。
从以上的示例中可以看到.INI文件是由许多节(Section)组成,与.INF文件(有关.INF文件,请参阅这里/s/blog_51a4af870100adv3.html)类似,整个.INI文件由几个节组成,节名用方括号扩起来,如[DeleteOnCopy]节,[DeleteOnCopy.A]节,[DeleteOnCopy.W]节,[.ShellClassInfo]节和[ExtShellFolderViews]节等等。
(说明:在本文中,所有的节名都用彩色,并使用加粗表示!)而每个节又由一系列的条目组成,每个条目都是由一个键(Key)与一个值(Value)组成,都是“Key=Value”这样的形式,在这些节中定义的项目可以保存系统或应用程序的相关配置设置。
.INI文件中分号后面的字符串是注释。
.INI文件的语法是统一的分节语法,随着操作系统的更新,微软逐渐增加了一些必要的关键字,但是整个的.INI文件的结构不会变化。
从语法上来说,.INI文件都是一个类别。
㈢、创建 Desktop.ini 文件在Windows XP系统中,是不能直接创建Desktop.ini文件的。
例如,直接复制Desktop.ini到某文件夹,用记事本编辑后保存到某文件夹下并命名为Desktop.ini,都是不可以的。
C语言读取INI配置文件Ini.h#pragma once#include"afxTempl.h"class DLLPORT CIni{private:CString m_strFileName;public:CIni(CString strFileName) :m_strFileName(strFileName){}public://一般性操作:BOOL SetFileName(LPCTSTR lpFileName); //设置文件名CString GetFileName(void); //获得文件名BOOL SetValue(LPCTSTR lpSection, LPCTSTR lpKey, LPCTSTR lpValue, bool bCreate = true); //设置键值,bCreate是指段名及键名未存在时,是否创建。
CString GetValue(LPCTSTR lpSection, LPCTSTR lpKey); //得到键值.BOOL DelSection(LPCTSTR strSection); //删除段名BOOL DelKey(LPCTSTR lpSection, LPCTSTR lpKey); //删除键名public://高级操作:int GetSections(CStringArray& arrSection); //枚举出全部的段名int GetKeyValues(CStringArray& arrKey, CStringArray& arrValue, LPCTSTR lpSection); //枚举出一段内的全部键名及值BOOL DelAllSections();};/*使用方法:CIni ini("c:\\a.ini");int n;/*获得值TRACE("%s",ini.GetValue("段1","键1"));*//*添加值ini.SetValue("自定义段","键1","值");ini.SetValue("自定义段2","键1","值",false);*//*枚举全部段名CStringArray arrSection;n=ini.GetSections(arrSection);for(int i=0;i<n;i++)TRACE("%s\n",arrSection[i]);*//*枚举全部键名及值CStringArray arrKey,arrValue;n=ini.GetKeyValues(arrKey,arrValue,"段1");for(int i=0;i<n;i++)TRACE("键:%s\n值:%s\n",arrKey[i],arrValue[i]); *//*删除键值ini.DelKey("段1","键1");*//*删除段ini.DelSection("段1");*//*删除全部ini.DelAllSections();*/Ini.cpp#include"StdAfx.h"#include"Ini.h"#define MAX_ALLSECTIONS 2048 //全部的段名#define MAX_SECTION 260 //一个段名长度#define MAX_ALLKEYS 6000 //全部的键名#define MAX_KEY 260 //一个键名长度BOOL CIni::SetFileName(LPCTSTR lpFileName){CFile file;CFileStatus status;if (!file.GetStatus(lpFileName, status))return TRUE;m_strFileName = lpFileName;return FALSE;}CString CIni::GetFileName(void){return m_strFileName;}BOOL CIni::SetValue(LPCTSTR lpSection, LPCTSTR lpKey, LPCTSTR lpValue, bool bCreate) {TCHAR lpTemp[MAX_PATH] = { 0 };//以下if语句表示如果设置bCreate为false时,当没有这个键名时则返回TRUE(表示出错)//!*&*none-value*&!* 这是个垃圾字符没有特别意义,这样乱写是防止凑巧相同。
ini文件写法
INI文件,全称初始化文件(Initialization File),是一种常用的配置文件格式,主要用于存储程序运行所需的配置信息。
INI 文件的写法相对简单,主要包括节(section)、键(key)和值(value)三个部分。
下面详细介绍INI文件的写法。
1. 节(section):INI文件中的配置信息通常按照功能或类别进行分组,这些分组就是节。
每个节都有一个唯一的名称,用方括号括起来。
2. 键(key):节中的配置信息需要用键来标识,键也有一个唯一的名称,用等号分隔。
键的名称可以是任意字符串,但建议使用有意义的英文单词或缩写。
3. 值(value):键所对应的具体配置信息就是值。
值可以是字符串、数字或其他数据类型。
4. 注释:INI文件中可以使用井号(#)表示注释,注释内容不会被解析。
5. 空行:INI文件中的空行会被忽略,可以用来分隔不同的配置信息。
6. 分行:如果一个值过长,需要分行显示,可以使用反斜杠实现。
7. 转义字符:INI文件中的转义字符需要使用双反斜杠表示。
8. 内置变量:INI文件中可以使用一些内置变量,
如%APPDATA%、%USERPROFILE%等,表示特定目录下的文件路径。
INI文件的基本写法包括节、键和值三个部分,可以通过组合这些基本元素来表示复杂的配置信息。
在实际使用中,可以根据需要创建多个节和键,以满足不同程序的配置需求。
C++操作.ini配置文件的API2009年12月09日星期三上午 11:05概述在程序中经常要用到设置或者其他少量数据的存盘,以便程序在下一次执行的时候可以使用,比如说保存本次程序执行时窗口的位置、大小、一些用户设置的数据等等,在 Dos 下编程的时候,我们一般自己产生一个文件,由自己把这些数据写到文件中,然后在下一次执行的时候再读出来使用。
在 Win32 编程中当然你也可以这样干,但 Windows 已经为我们提供了两种方便的办法,那就是使用注册表或者 ini 文件(Profile)来保存少量数据。
本文中先介绍一下 .ini 文件的使用。
ini 文件是文本文件,中间的数据格式一般为:[Section1 Name]KeyName1=value1KeyName2=value2...[Section2 Name]KeyName1=value1KeyName2=value2ini 文件可以分为几个 Section,每个 Section 的名称用 [] 括起来,在一个 Section 中,可以有很多的 Key,每一个 Key 可以有一个值并占用一行,格式是 Key=value,Win32 对 ini 文件操作的 api 中,有一部分是对 win.ini 操作的,有一部分是对用户自定义的 ini 文件操作的。
Win.in 和system.ini 是Windows的两个非常重要的初始化文件,Windows将用户所作的选择以及各种变化的系统信息记录在这两个文件中。
System.ini 描述了系统硬件的当前状态,Win.ini 文件则包含了Windows 系统运行环境的当前配置。
由于 Win.ini 文件的重要性和常用性,Win32 中有专门对 Win.ini 进行操作的 api,它们是:GetProfileInt - 从 Win.ini 文件的某个 Section 取得一个 key 的整数值,它的原形是:GetProfileInt(LPCTSTR lpAppName, // 指向包含 Section 名称的字符串地址LPCTSTR lpKeyName, // 指向包含 Key 名称的字符串地址INT nDefault // 如果 Key 值没有找到,则返回缺省的值是多少);如果 Key 值没有找到的话,返回值是 nDefault 指定的缺省值,如果 Key 中的值是负数,则返回 0,如果 Key 指定的是数字和字符串的混合,则返回数字部分的值,比如说 x=1234abcd,则返回 1234GetProfileString - 从 Win.ini 文件的某个 Section 取得一个 key 的字符串,它的原形是:GetProfileString(LPCTSTR lpAppName, // 指向包含 Section 名称的字符串地址LPCTSTR lpKeyName, // 指向包含 Key 名称的字符串地址LPCTSTR lpDefault, // 如果 Key 值没有找到,则返回缺省的字符串的地址LPTSTR lpReturnedString, // 返回字符串的缓冲区地址DWORD nSize // 缓冲区的长度);返回的字符串在缓冲区内,返回的 eax 值是返回的字符串的长度(不包括尾部的0)GetProfileSection - 从 Win.ini 文件中读出整个 Section 的内容,它的原形是:GetProfileSection(LPCTSTR lpAppName, // 指向包含 Section 名称的字符串地址LPTSTR lpReturnedString, // 返回数据的缓冲区地址DWORD nSize // 返回数据的缓冲区长度);WriteProfileSection - 将一个整个 Section 的值写入 Win.ini 文件的指定 Section 中,它的原形是:WriteProfileSection(LPCTSTR lpAppName, // 指向包含 Section 名称的字符串地址LPCTSTR lpString // 要写入的数据的地址);如果 Win.ini 没有指定的 Section,API 会新建立一个并写入数据,如果已经存在,则先删除原来Seciton 中所有的 Key 值然后写入新的。
ini文件解析代码(实用版)目录1.ini 文件解析代码概述2.ini 文件解析代码的实现方法3.ini 文件解析代码的应用实例4.ini 文件解析代码的优缺点分析5.总结正文一、ini 文件解析代码概述ini 文件是一种常见的配置文件格式,常用于存储软件的配置信息。
这类文件的结构比较简单,一般是由一组组键值对组成。
每组键值对之间以换行符分隔,而键和值之间以等号(=)分隔。
正因为这种简洁明了的结构,ini 文件被广泛应用于各种编程语言和软件中。
为了让程序能够读取和解析 ini 文件,我们需要编写相应的解析代码。
本文将介绍如何实现 ini 文件解析代码,并给出一个应用实例。
二、ini 文件解析代码的实现方法实现 ini 文件解析代码的方法有很多,这里我们以 Python 语言为例,介绍一种简单的实现方法。
1.使用 Python 内置的 configparser 模块Python 的 configparser 模块提供了一种简单的方法来解析 ini 文件。
首先,需要导入 configparser 模块,然后使用 ConfigParser 类的构造函数创建一个解析器对象。
接下来,使用该对象的 read() 方法读取 ini 文件,最后,通过该对象的方法获取所需的键值对。
以下是一个简单的示例:```pythonimport configparser# 创建一个解析器对象config = configparser.ConfigParser()# 读取 ini 文件config.read("config.ini")# 获取键值对username = config.get("user", "name")password = config.get("user", "password")print("用户名:", username)print("密码:", password)```2.自定义解析函数除了使用 Python 内置的 configparser 模块外,还可以通过编写自定义函数来实现 ini 文件的解析。
ini文件只知道节名,读取节下所有值的方法qt1.引言1.1 概述概述INI文件是一种常见的配置文件格式,它被广泛用于存储和管理应用程序的配置信息。
INI文件由一系列的节(section)和键值对(key-value)组成。
每个节包含一组相关的键值对,用来描述特定的配置项。
在读取INI 文件时,通常可以根据节名和键名来获取对应的值。
然而,在某些情况下,我们可能只知道节的名称,而不清楚该节下有哪些键值对。
本文将介绍如何通过Qt框架提供的方法来读取INI文件中某个节下的所有键值对。
首先,我们需要了解Qt框架中关于INI文件的相关类和函数。
Qt提供了一个名为QSettings的类,它是用于读写配置信息的工具类。
QSettings类支持INI文件格式,并提供了方便的方法来读取和写入INI 文件中的配置项。
在使用QSettings类读取INI文件时,我们可以先使用QSettings的构造函数来指定INI文件的路径,然后使用value()函数来获取指定节下的键值对。
为了读取某个节下的所有键值对,我们可以使用childGroups()函数来获取所有的子节名,然后再遍历每个子节获取其对应的键值对。
下面是一个简单的示例代码,展示了如何使用Qt框架中的QSettings 类来读取INI文件中某个节下的所有键值对:cppinclude <QSettings>include <QDebug>void readIniFile(const QString& filePath){QSettings settings(filePath, QSettings::IniFormat);QStringList sectionList = settings.childGroups();foreach (const QString& section, sectionList) {settings.beginGroup(section);QStringList keys = settings.childKeys();foreach (const QString& key, keys) {QString value = settings.value(key).toString();qDebug() << "Section:" << section << "Key:" << key << "Value:" << value;}settings.endGroup();}}int main(){QString filePath = "config.ini";readIniFile(filePath);return 0;}以上代码中,readIniFile()函数用于读取INI文件中某个节下的所有键值对。
ini配置文件操作方法一、ini文件介绍ini配置文件常用于存储项目全局变量如:接口地址、输出文件路径、项目地址、用户名、密码等二、ini文件编写格式[节点]选项=选项值;表示注释注意:节点名不可以重复【所以写入新节点前要判断是否存在】三、.ini 文件读取1、.ini文件读import configparserconfig = configparser.ConfigParser()config.read('config.ini')# 获取所有节点sec = config.sections()print(sec)# 获取单个节点下所有选项db = config.options(section="database")print(db)# 获取单个节点下某个选项值username = config.get(section="database", option="username")print(username)# 获取某个节点下所有选项及选项值value = config.items(section="database")print(f"获取到的值是:{value}")2、ini文件写# 增加一个节点config.add_section("db")# 给节点增加选项和值config.set(section="db", option="usr", value="chuanzhang") # 保存操作with open(os.path.dirname(__file__)+'/config.ini', mode='w+') as file:config.write(file)file.close()3、删除# 删除节点下某个选项config.remove_option(section="db", option="pwd")with open(os.path.dirname(__file__)+'/config.ini', mode='w+') as opt:config.write(opt)opt.close()# 删除节点config.remove_section("db")# 删除后保存with open(os.path.dirname(__file__)+'/config.ini', mode='w+') as data:config.write(data)data.close()。
ini是什么⽂件格式?.ini⽂件怎么打开?
ini⽂件是系统初始化⽂件,统管windows的各项配置,是windows的系统配置⽂件所采⽤的存储格式,我们使⽤的软件中的配置信息就储存在ini⽂件中。
⼀般情况下正常的设置我们在软件界⾯中就可以实现,但在某些情况,还是要直接编辑ini才⽅便,⽼鸟们都习惯直接编辑ini⽂件。
ini是什么⽂件?
作为系统配置⽂件ini⽂件可以⽤来存放软件信息、注册表信息等。
ini⽂件统管windows的各项配置,在我们使⽤的应⽤程序下⼀般都有ini⽂件,⽤来配置软件以实现不同⽤户的要求。
⼩⽩们不⽤直接编辑这些ini⽂件,在软件的图形界⾯下进⾏设置对⼩⽩们来说更为简单直接。
ini⽂件如何打开?
ini⽂件可以⽤记事本打开,直接进⾏编辑,ini⽂件内存储的各项配置信息都可以编辑,但如果操作不当,可能引起软件崩溃,不推荐新⼿尝试。
下⾯给⼤家推荐⼏款强⼤的⽂本编辑器,可以完全替代记事本,完美⽀持打开ini⽂件。
写了这么多,相信读者对ini⽂件有了更深的了解。
vc 用函数读写INI配置文件ini文件(即Initialization file),这种类型的文件中通常存放的是一个程序的初始化信息。
ini文件由若干个节(Section)组成,每个Section由若干键(Key)组成,每个Key可以赋相应的值。
读写ini文件实际上就是读写某个的Section中相应的Key的值,而这只要借助几个函数即可完成。
一、向ini文件中写入信息的函数1. 把信息写入系统的win.ini文件BOOL WriteProfileString(LPCTSTR lpAppName, // 节的名字,是一个以0结束的字符串LPCTSTR lpKeyName, // 键的名字,是一个以0结束的字符串。
若为NULL,则删除整个节LPCTSTR lpString // 键的值,是一个以0结束的字符串。
若为NULL,则删除对应的键)2. 把信息写入自己定义的.ini文件BOOL WritePrivateProfileString(LPCTSTR lpAppName, // 同上LPCTSTR lpKeyName, // 同上LPCTSTR lpString, // 同上LPCTSTR lpFileName // 要写入的文件的文件名。
若该ini文件与程序在同一个目录下,也可使用相对//路径,否则需要给出绝度路径。
)如:::WriteProfileString("Test","id","xym");//在win.ini中创建一个Test节,并在该节中创建一个键id,其值为xym::WritePrivateProfileString("Test","id","xym","d:\\vc\\Ex1\\ex1.ini" );//在Ex1目录下的ex1.ini中创建一个Test节,并在该节中创建一个键id,其值为xym//若Ex1.ini文件与读写该文件的程序在同一个目录下,则上面语句也可写为:::WritePrivateProfileString("Test","id","xym",".\\ex1.ini");需要注意的是,C系列的语言中,转义字符'\\'表示反斜线'\'。
QT中如何读写ini配置⽂件如图1所⽰,我们需要在QT界⾯中实现⼿动读取参数存放的位置,那么我们该如何做呢?⽅法:读取ini格式的配置⽂件,实现路径的写⼊与读取。
第⼀步:界⾯构造函数中,初始化⼀个Config.ini⽂件//初始化⼀个.ini配置⽂件//qApp是QT系统⾃带的,可以直接使⽤QString iniFilePath=qApp->applicationDirPath()+"/Config.ini";//如果不存在Config.ini,便⽣成⼀个Config.ini。
如果已经存在了,则略过。
if(!QFile::exists(iniFilePath)){QSettings configIniWrite(iniFilePath,QSettings::IniFormat);configIniWrite.beginGroup("calib_data_path");configIniWrite.setValue("calib_data_path","FA0180090134.xml");configIniWrite.endGroup();configIniWrite.beginGroup("robot_pose_file");configIniWrite.setValue("robot_pose_file_path","robot_pose_file.txt");configIniWrite.endGroup();}第⼆步:定义⼀个保存Config⽂件的函数void saveConfig(const QString& group,const QString& name, const QVariant& var){QString iniFilePath = qApp->applicationDirPath() + "/Config.ini";if (QFile::exists(iniFilePath)){QSettings configIniWrite(iniFilePath,QSettings::IniFormat);configIniWrite.beginGroup(group);configIniWrite.setValue(name,var);configIniWrite.endGroup();}}第三步:设置路径Demo1://设置相机标定⽂件路径void CalibrationForm::btnLoadCamParaPath_clicked(){QFileDialog dialog(this,tr("Select calib data file"));dialog.setAcceptMode(QFileDialog::AcceptOpen);dialog.setFileMode(QFileDialog::ExistingFile);static bool firstDialog = true;if (firstDialog){firstDialog = false;const QStringList fileLocations =QStandardPaths::standardLocations(QStandardPaths::DesktopLocation);dialog.setDirectory(fileLocations.isEmpty() ?QDir::currentPath():st());}dialog.setNameFilter(tr("FA0180090134(*.xml)"));if (dialog.exec()==QDialog::Accepted){//获得⽂件夹路径+⽂件名_campara_path = dialog.selectedFiles().first();ui->lineEditCamParaPath->setText(_campara_path); //此处是在lineEdit窗⼝显⽰路径名+⽂件名saveConfig("calib_data_path","calib_data_path",_campara_path);}}demo2://设置⼿眼标定时的机械臂运动轨迹路径void CalibrationForm::btnLoadRobotPara_clicked(){QFileDialog dialog(this,tr("Select robot pose file"));dialog.setAcceptMode(QFileDialog::AcceptOpen);dialog.setFileMode(QFileDialog::ExistingFile);static bool first_Dialog = true;if (first_Dialog){first_Dialog = false;const QStringList fileLocations =QStandardPaths::standardLocations(QStandardPaths::DesktopLocation);dialog.setDirectory(fileLocations.isEmpty()?QDir::currentPath():st());}dialog.setNameFilter(tr("robot_pose_file(*.txt)"));if (dialog.exec()==QDialog::Accepted){_robot_pose_path = dialog.selectedFiles().first();ui->lineEditRobotPath->setText(_robot_pose_path);saveConfig("robot_pose_file","robot_pose_file_path",_robot_pose_path);}}由于ini⽂件不可在星球中上传,此处⽤txt形式的截图作为附件,见图2.到此这篇关于QT中如何读写ini配置⽂件的⽂章就介绍到这了,更多相关QT读写ini内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。
CC++关于如何读写ini配置⽂件(⼩结)我们可能经常⽤到配置⽂件ini⽂件来获取或者保存参数信息,在VC中其函数中主要⽤到的有:读取1. 读取字符DWORD GetPrivateProfileString(LPCTSTR lpAppName, // INI⽂件中的⼀个字段名[节名]可以有很多个节名LPCTSTR lpKeyName, // lpAppName 下的⼀个键名,也就是⾥⾯具体的变量名LPCTSTR lpDefault, // 如果lpReturnedString为空,则把个变量赋给lpReturnedStringLPTSTR lpReturnedString, // 存放键值的指针变量,⽤于接收INI⽂件中键值(数据)的接收缓冲区DWORD nSize, // lpReturnedString的缓冲区⼤⼩LPCTSTR lpFileName // INI⽂件的路径);2. 读取整型值 (返回值为读到的整)UINT GetPrivateProfileInt(LPCTSTR lpAppName, // INI⽂件中的⼀个字段名[节名]可以有很多个节名LPCTSTR lpKeyName, // lpAppName 下的⼀个键名,也就是⾥⾯具体的变量名INT nDefault, // 如果没有找到指定的数据返回,则把个变量值赋给返回值LPCTSTR lpFileName // INI⽂件的路径);写⼊1. 写⼊字符BOOL WritePrivateProfileString(LPCTSTR lpAppName, // INI⽂件中的⼀个字段名[节名]可以有很多个节名LPCTSTR lpKeyName, // lpAppName 下的⼀个键名,也就是⾥⾯具体的变量名LPCTSTR lpString, // 键值,也就是数据LPCTSTR lpFileName // INI⽂件的路径);2. 写⼊整型读写INI⽂件时相对路径和绝对路径都可以,根据实际情况选择 "..\\IniFileName.ini" // 这样的为相对路径 "D:\\IniFileName.ini" // 这样的为绝对路径MAX_PATH:是微软最⼤路径占的字节所设的宏 写⼊的ini⽂件分为:节、键名、键值 举个栗⼦: // XX.ini [串⼝配置] 波特率=19200有了理论,再看看实践的demo:写INI⽂件:LPTSTR lpPath = new char[MAX_PATH];strcpy(lpPath, "D:\\IniFileName.ini");WritePrivateProfileString("LiMing", "Sex", "Man", lpPath);WritePrivateProfileString("LiMing", "Age", "20", lpPath);WritePrivateProfileString("Fangfang", "Sex", "Woman", lpPath);WritePrivateProfileString("Fangfang", "Age", "21", lpPath);delete [] lpPath;INI⽂件如下:[LiMing]Sex=ManAge=20[Fangfang]Sex=WomanAge=21读INI⽂件:TCHAR FPath[128];::GetCurrentDirectory(MAX_PATH, FPath);strcat(FPath, ".\\Config.ini");CFile ConfigFile;if(!ConfigFile.Open(FPath, CFile::modeCreate||CFile::modeRead, NULL)){AfxMessageBox("打开Config.ini配置⽂件失败!!!");return FALSE;}ConfigFile.Close();LPTSTR lpPath = new char[MAX_PATH];LPTSTR LiMingSex = new char[6];int LiMingAge;LPTSTR FangfangSex = new char[6];int FangfangAge;strcpy(lpPath, "..\\IniFileName.ini");GetPrivateProfileString("LiMing", "Sex", "", LiMingSex, 6, lpPath);LiMingAge = GetPrivateProfileInt("LiMing", "Age", 0, lpPath);GetPrivateProfileString("Fangfang", "Sex", "", FangfangSex, 6, lpPath);FangfangAge = GetPrivateProfileInt("Fangfang", "Age", 0, lpPath);delete [] lpPath;配置⽂件中经常⽤到ini⽂件,在VC中其函数分别为:写⼊.ini⽂件:bool WritePrivateProfileString(LPCTSTR lpAppName,LPCTSTR lpKeyName,LPCTSTR lpString,LPCTSTR lpFileName);读取.ini⽂件:DWORD GetPrivateProfileString(LPCTSTR lpAppName,LPCTSTR lpKeyName,LPCTSTR lpDefaut,LPSTR lpReturnedString,DWORD nSize,LPCTSTR lpFileName);读取整形值:UINT GetPrivateProfileInt(LPCTSTR lpAppName,LPCTSTR lpKeyName,INT nDefault,LPCTSTR lpFileName);其中个参数的意思:LPCTSTR lpAppName ------- INI⽂件中的⼀个字段名LPCTSTR lpKeyName -------- lpAppName 下的⼀个键名,也就是⾥⾯具体的变量名LPCTSTR lpString ---------是键值,也就是变量的值,必须为LPCTSTR或CString类型LPCTSTR lpFileName --------完整的INI⽂件路径名LPCTSTR lpDefaut ----------如果没有其前两个参数值,则将此值赋给变量LPSTR lpReturnedString --------接收INI⽂件中的值的CString对象,即接收缓冲区DWORD nSize ------接收缓冲区的⼤⼩例⼦:CString StrName,Strtemp;int nAge;StrName = "jacky";nAge = 13;WritePrivateProfileString("Student","Name",StrName,"c:\\setting.ini");结果:(INI⽂件中显⽰如下:)[Student]Name=jacky读取:CString SName;GetPrivateProfileString("Student","Name","DefaultName",SName.GetBuffer(MAX_LENGTH),MAX_LENGTH,"c:\\setting.ini");结果:SName = "jacky";这⾥需要注意点就是⽤完GetBuffer函数后⼀定要释放(⽤SName.ReleaseBuffer()函数),不然后⾯再⽤到SName 的其他⼦函数就会失灵。
Python3读写ini配置⽂件的⽰例ini⽂件即Initialization File初始化⽂件,在应⽤程序及框架中常作为配置⽂件使⽤,是⼀种静态纯⽂本⽂件,使⽤记事本即可编辑。
配置⽂件的主要功能就是存储⼀批变量和变量值,在ini⽂件中使⽤[章(Section)]对变量进⾏了分组,基本格式如下。
# filename: config.ini[user]name=adminpassword=123456is_admin=true[mysql]host=10.10.10.10port=3306db=apitestuser=rootpassword=123456[log]file=run.loglevel=info以上⽂件中,有3个Section段,分别user、mysql和log。
使⽤配置⽂件的好处在于,不⽤修改代码⽂件就可以更改使⽤的⽤户、数据库以及⽇志的配置,避免修改代码带来新的bug,或需要重新打包(如Java项⽬中)。
ini⽂件中使⽤#或者;添加注释,最好独占⼀⾏,不能写在变量后⾯读取读取ini配置⽂件需要使⽤Python3⾃带的configparser库,使⽤⽰例如下from configparser import ConfigParser # Python2中是from ConfigParser import ConfigParserconf = ConfigParser() # 需要实例化⼀个ConfigParser对象conf.read('config.ini') # 需要添加上config.ini的路径,不需要open打开,直接给⽂件路径就读取,也可以指定encoding='utf-8'print(conf['user']['name']) # 读取user段的name变量的值,字符串格式conf对象每个section段的数据类似于⼀个字典,可以使⽤['变量名']或者.get('变量名')获取对应的值,获取到的是字符串格式。
Qt读写三种⽂件,QSettings读ini配置⽂件,QJsonDocument读JSON。
第⼀种INI配置⽂件.ini ⽂件是Initialization File的缩写,即初始化⽂件。
除了windows现在很多其他操作系统下⾯的应⽤软件也有.ini⽂件,⽤来配置应⽤软件以实现不同⽤户的要求。
⼀般不⽤直接编辑这些.ini⽂件,应⽤程序的图形界⾯即可操作以实现相同的功能。
它可以⽤来存放软件信息,注册表信息等。
读INI⽂件INI⽂件内容如下:[conn]ip=127.0.0.1port=8080databaseversion=QSQLITEdatabasename=studentusername=YYCpassword=rootqreadini.h⽂件内容如下:#ifndef QREADINI_H#define QREADINI_H#include<QSettings>#define DATACONFIG QReadIni::getInstance()->getIniConfig()typedef struct IniConfig{QString ip; //IP地址QString port; //端⼝QString dataBaseVersion; //数据库版本QString dataBaseName; //数据库名称QString userName; //⽤户名QString passWord; //密码}IniConfig;class QReadIni{public:static QReadIni*getInstance();void readIni();const IniConfig &getIniConfig();private:QReadIni();IniConfig iniConfig;static QReadIni*instance;};#endif// QREADINI_Hqreadini.cpp⽂件内容如下:#include "qreadini.h"QReadIni*QReadIni::instance = NULL;QReadIni *QReadIni::getInstance(){if(instance == NULL){instance = new QReadIni();}return instance;}QReadIni::QReadIni(){this->readIni();}void QReadIni::readIni(){QSettings * configIniRead = new QSettings("config.ini",QSettings::IniFormat);//初始化读取Ini⽂件对象 iniConfig.ip = configIniRead->value("conn/ip").toString(); //IP地址iniConfig.port = configIniRead->value("conn/port").toString(); //端⼝iniConfig.dataBaseVersion = configIniRead->value("conn/databaseversion").toString();//数据库版本iniConfig.dataBaseName = configIniRead->value("conn/databasename").toString(); //数据库名称 erName = configIniRead->value("conn/username").toString(); //⽤户名iniConfig.passWord = configIniRead->value("conn/password").toString(); //密码delete configIniRead;}const IniConfig &QReadIni::getIniConfig(){return iniConfig;}写ini⽂件#include <QtCore/QCoreApplication>#include <QSettings>int main(int argc, char *argv[]){QCoreApplication a(argc, argv);//Qt中使⽤QSettings类读写ini⽂件//QSettings构造函数的第⼀个参数是ini⽂件的路径,第⼆个参数表⽰针对ini⽂件,第三个参数可以缺省QSettings *configIniWrite = new QSettings("hahaya.ini", QSettings::IniFormat);//向ini⽂件中写⼊内容,setValue函数的两个参数是键值对//向ini⽂件的第⼀个节写⼊内容,ip节下的第⼀个参数configIniWrite->setValue("/ip/first", "192.168.0.1");//向ini⽂件的第⼀个节写⼊内容,ip节下的第⼆个参数configIniWrite->setValue("ip/second", "127.0.0.1");//向ini⽂件的第⼆个节写⼊内容,port节下的第⼀个参数configIniWrite->setValue("port/open", "2222");//写⼊完成后删除指针delete configIniWrite;return a.exec();}第⼆种JSON⽂件"conn": {"ip": "127.0.0.1","port": "8080","databaseversion": "QSQLITE","databasename": "student","username": "YYC","password": "root"}}qreadjson.h⽂件内容如下#ifndef QREADJSON_H#define QREADJSON_H#include <QString>#include <QFile>#include <QIODevice>#include <QDomNodeList>#include <QJsonDocument>#include <QJsonObject>#define JSONCONFIG QReadJson::getInstance()->getJsonConfig() typedef struct JsonConfig{QString ip; //IP地址QString port; //端⼝QString dataBaseVersion; //数据库版本QString dataBaseName; //数据库名称QString userName; //⽤户名QString passWord; //密码}JsonConfig;class QReadJson{public:static QReadJson * getInstance();bool readJson();const JsonConfig &getJsonConfig();private:QReadJson();static QReadJson * instance;JsonConfig jsonConfig;};#endif// QREADJSON_Hqreadjson.cpp内容如下:#include"qreadjson.h"QReadJson * QReadJson::instance = NULL;QReadJson *QReadJson::getInstance(){if(NULL == instance){instance = new QReadJson();return instance;}QReadJson::QReadJson(){this->readJson();}bool QReadJson::readJson(){QString strJson;QFile *file=new QFile("config.json");if(file->open(QIODevice::ReadOnly | QIODevice::Text)){strJson = file->readAll();file->close();}else{return false;}file->close();QJsonDocument jsonDom = QJsonDocument::fromJson(strJson.toUtf8()); QJsonObject jsonObject = jsonDom.object();QJsonValue jsonValue = jsonObject.value(QString("conn"));QJsonObject objectItem = jsonValue.toObject();jsonConfig.ip = objectItem["ip"].toString();jsonConfig.port = objectItem["port"].toString();jsonConfig.dataBaseVersion = objectItem["databaseversion"].toString(); jsonConfig.dataBaseName = objectItem["databasename"].toString();erName = objectItem["username"].toString();jsonConfig.passWord = objectItem["password"].toString();delete file;return true;}const JsonConfig &QReadJson::getJsonConfig(){return jsonConfig;}第三种是读取xml⽂件:<?xml version="1.0" encoding="UTF-8"?>-<data>-<database><ip>127.0.0.1</ip><port>8080</port><databaseversion>QSQLITE</databaseversion><databasename>student.db</databasename><username>root</username><password>123</password></database>qreadxml.h⽂件内容如下:#ifndef QREADXML_H#define QREADXML_H#include<QString>#include<QtXml>#include<QFile>#include<QIODevice>#include<QDomNodeList>#define XMLCONFIG QReadXml::getInstance()->getXmlConfig() typedef struct XmlConfig{QString ip; //IP地址QString port; //端⼝QString dataBaseVersion; //数据库版本QString dataBaseName; //数据库名称QString userName; //⽤户名QString passWord; //密码}XmlConfig;class QReadXml{public:static QReadXml * getInstance();bool readXML();const XmlConfig &getXmlConfig();private:QReadXml();XmlConfig xmlConfig;static QReadXml * instance;};#endif// QREADXML_Hqreadxml.cpp⽂件如下#include "qreadxml.h"QReadXml *QReadXml::instance = NULL;QReadXml *QReadXml::getInstance(){if(NULL == instance){instance = new QReadXml();}return instance;}QReadXml::QReadXml(){this->readXML();}bool QReadXml::readXML(){int countData = 0;QDomDocument dom;QFile *file=new QFile("config.xml");if(file->open(QIODevice::ReadOnly)){if(!dom.setContent(file)) //将该xml⽂件导⼊到dom中{file->close();return false;}}else{return false;}file->close();QDomElement docElem = dom.documentElement(); //返回根元素QDomNode node = docElem.firstChild(); //返回根节点的第⼀个⼦节点while(!node.isNull()) //如果节点不为空{if(node.isElement()) //如果节点是元素{QDomElement element=node.toElement();//将其转化为元素QDomNodeList list=element.childNodes();//取出该元素的所有⼦节点放到list中 //将⼦节点元素全部取出来for(int i = 0; i < list.count(); i ++){QDomNode domNode = list.at(i);if(domNode.isElement()){//取出我们所要的数据switch(i){case0:xmlConfig.ip = domNode.toElement().text();break;case1:xmlConfig.port = domNode.toElement().text();break;case2:xmlConfig.dataBaseVersion = domNode.toElement().text();break;case3:xmlConfig.dataBaseName = domNode.toElement().text();break;case4:erName = domNode.toElement().text();break;case5:xmlConfig.passWord = domNode.toElement().text();break;}}}}countData++;node = node.nextSibling(); //下⼀个兄弟节点}return countData > 0 ? true : false;}const XmlConfig &QReadXml::getXmlConfig(){return xmlConfig;}原⽂:。
ini文件用法
INI文件是一种配置文件,通常用于存储应用程序或系统的配置信息。
INI文件由节(section)、键(key)和值(value)组成,通常采用“分节分条”的组织方式。
以下是INI文件的基本用法:
创建INI文件:首先需要创建一个INI文件,可以在文本编辑器中手动创建,也可以使用编程语言中的相关函数或库来创建。
添加节:在INI文件中,节是用来组织配置信息的区域,每个节都以方括号([])括起来。
可以在INI文件中添加多个节,以便对配置信息进行分类管理。
添加键和值:在每个节中,可以添加多个键值对。
键和值之间使用等号(=)分隔,并使用分号(;)表示注释。
例如,[section1] key1=value1; key2=value2。
读取INI文件:读取INI文件可以使用编程语言中的相关函数或库来实现。
根据INI文件的格式,逐行读取文件内容,并解析节、键和值。
修改INI文件:可以直接编辑INI文件来修改配置信息,也可以使用编程语言中的相关函数或库来读取和修改配置信息。
修改完成后,保存INI文件即可。
删除INI文件:如果不再需要INI文件,可以直接将其删除。
需要注意的是,删除INI文件可能会影响到应用程序或系统的正常运行。
需要注意的是,INI文件的语法比较简单,容易受到一些安全风险的影响。
因此,在读取和修改INI文件时,需要特别注意文件的来源和内容的合法性,以避免安全漏洞。
python读写增删修改ini配置⽂件⼀,百度百科 .ini ⽂件是Initialization File的缩写,即初始化⽂件,是windows的系统所采⽤的存储格式,统管windows的各项配置,⼀般⽤户就⽤windows提供的各项图形化管理界⾯就可实现相同的配置了。
但在某些情况,还是要直接编辑ini才⽅便,⼀般只有很熟悉windows才能去直接编辑。
开始时⽤于WIN3X下⾯,WIN95⽤代替,以及后⾯的内容表⽰⼀个节,相当于注册表中的键。
⼆,配置程序⽰例ini配置⽂件(setting.ini)1 [txtA]2 name = comma,end,full,run3 comma = 10004 end = 35 full = 26 run = 17 default_comma = 38 default_end = 39 default_full = 210 default_run = 11112 [txtB]13 name = comma,end,full,run14 comma = 100015 end = 316 full = 217 run = 118 default_comma = 319 default_end = 320 default_full = 221 default_run = 12223 [chinese]24 name = volume,tones,speed,spokesman25 volume = 526 tones = 527 speed = 528 spokesman = 129 default_volume = 530 default_tones = 531 default_speed = 532 default_spokesman = 13334 [english]35 name = volume,tones,speed,spokesman36 volume = 537 tones = 538 speed = 539 spokesman = 140 default_volume = 541 default_tones = 542 default_speed = 543 default_spokesman = 14445 [help]4647 [about]⽰例ini配置⽂件操作程序1:使⽤configparser函数,缺点:增删、修改都是重写ini⽂件操作1import configparser2import os345# *** 初始化配置⽂件路径 *** #6 curpath = os.path.dirname(os.path.realpath(__file__)) # 当前⽂件路径7 inipath = os.path.join(curpath, "setting.ini") # 配置⽂件路径(组合、相对路径)89# *** 数据读取 *** #10 conf = configparser.ConfigParser()11 conf.read(inipath, encoding="utf-8")12# sections = conf.sections() # 获取所有的sections名称13# options = conf.options(sections[0]) # 获取section[0]中所有options的名称14# items = conf.items(sections[0]) # 获取section[0]中所有的键值对15# value = conf.get(sections[-1],'txt2') # 获取section[-1]中option的值,返回为string类型16# value1 = conf.getint(sections[0],'comma') # 返回int类型17# value2 = conf.getfloat(sections[0],'end') # 返回float类型18# value3 = conf.getboolean(sections[0],'run') # 返回boolen类型1920# *** 删除内容 *** #21# conf.remove_option(sections[0], "comma")22# conf.remove_section(sections[1])2324# *** 修改内容 *** #25 conf.set('txtB', "comma", "1000")26 conf.write(open(inipath, "r+", encoding="utf-8")) # r+模式272829# print(conf.items(sections[0]) )⽰例ini配置⽂件操作程序2:使⽤configobj 函数1from configobj import ConfigObj2# *** 配置⽂件预处理 *** #3 config = ConfigObj("setting.ini",encoding='UTF8')45# *** 读配置⽂件 *** #6# print(config['txtB'])7# print(config['txtB']['name'])89# *** 修改配置⽂件 *** #10# config['txtB']['comma'] = "Mufasa"11# config.write()1213# *** 添加section *** #14# config['txtC'] = {}15# config['txtC']['index0'] = "wanyu00"16# config.write()。
Mysqlmy.ini配置⽂件详解Mysql my.ini 配置⽂件详解#BEGIN CONFIG INFO#DESCR: 4GB RAM, 只使⽤InnoDB, ACID, 少量的连接, 队列负载⼤#TYPE: SYSTEM#END CONFIG INFO## 此mysql配置⽂件例⼦针对4G内存# 主要使⽤INNODB#处理复杂队列并且连接数量较少的mysql服务器## 将此⽂件复制到/etc/f 作为全局设置,# mysql-data-dir/f 作为服务器指定设置# (@localstatedir@ for this installation) 或者放⼊# ~/f 作为⽤户设置.## 在此配置⽂件中, 你可以使⽤所有程序⽀持的长选项.# 如果想获悉程序⽀持的所有选项# 请在程序后加上"--help"参数运⾏程序.## 关于独⽴选项更多的细节信息可以在⼿册内找到### 以下选项会被MySQL客户端应⽤读取.# 注意只有MySQL附带的客户端应⽤程序保证可以读取这段内容.# 如果你想你⾃⼰的MySQL应⽤程序获取这些值# 需要在MySQL客户端库初始化的时候指定这些选项#[client]#password = [your_password]port = @MYSQL_TCP_PORT@socket = @MYSQL_UNIX_ADDR@# *** 应⽤定制选项 ***## MySQL 服务端#[mysqld]# ⼀般配置选项port = @MYSQL_TCP_PORT@socket = @MYSQL_UNIX_ADDR@# back_log 是操作系统在监听队列中所能保持的连接数,# 队列保存了在MySQL连接管理器线程处理之前的连接.# 如果你有⾮常⾼的连接率并且出现"connection refused" 报错,# 你就应该增加此处的值.# 检查你的操作系统⽂档来获取这个变量的最⼤值.# 如果将back_log设定到⽐你操作系统限制更⾼的值,将会没有效果back_log = 50# 不在TCP/IP端⼝上进⾏监听.# 如果所有的进程都是在同⼀台服务器连接到本地的mysqld,# 这样设置将是增强安全的⽅法# 所有mysqld的连接都是通过Unix sockets 或者命名管道进⾏的.# 注意在windows下如果没有打开命名管道选项⽽只是⽤此项# (通过 "enable-named-pipe" 选项) 将会导致mysql服务没有任何作⽤!#skip-networking# MySQL 服务所允许的同时会话数的上限# 其中⼀个连接将被SUPER权限保留作为管理员登录.# 即便已经达到了连接数的上限.max_connections = 100# 每个客户端连接最⼤的错误允许数量,如果达到了此限制.# 这个客户端将会被MySQL服务阻⽌直到执⾏了"FLUSH HOSTS" 或者服务重启# ⾮法的密码以及其他在链接时的错误会增加此值.# 查看 "Aborted_connects" 状态来获取全局计数器.max_connect_errors = 10# 所有线程所打开表的数量.# 增加此值就增加了mysqld所需要的⽂件描述符的数量# 这样你需要确认在[mysqld_safe]中 "open-files-limit" 变量设置打开⽂件数量允许⾄少4096table_cache = 2048# 允许外部⽂件级别的锁. 打开⽂件锁会对性能造成负⾯影响# 所以只有在你在同样的⽂件上运⾏多个数据库实例时才使⽤此选项(注意仍会有其他约束!)# 或者你在⽂件层⾯上使⽤了其他⼀些软件依赖来锁定MyISAM表#external-locking# 服务所能处理的请求包的最⼤⼤⼩以及服务所能处理的最⼤的请求⼤⼩(当与⼤的BLOB字段⼀起⼯作时相当必要)# 每个连接独⽴的⼤⼩.⼤⼩动态增加max_allowed_packet = 16M# 在⼀个事务中binlog为了记录SQL状态所持有的cache⼤⼩# 如果你经常使⽤⼤的,多声明的事务,你可以增加此值来获取更⼤的性能.# 所有从事务来的状态都将被缓冲在binlog缓冲中然后在提交后⼀次性写⼊到binlog中# 如果事务⽐此值⼤, 会使⽤磁盘上的临时⽂件来替代.# 此缓冲在每个连接的事务第⼀次更新状态时被创建binlog_cache_size = 1M# 独⽴的内存表所允许的最⼤容量.# 此选项为了防⽌意外创建⼀个超⼤的内存表导致永尽所有的内存资源.max_heap_table_size = 64M# 排序缓冲被⽤来处理类似ORDER BY以及GROUP BY队列所引起的排序# 如果排序后的数据⽆法放⼊排序缓冲,# ⼀个⽤来替代的基于磁盘的合并分类会被使⽤# 查看 "Sort_merge_passes" 状态变量.# 在排序发⽣时由每个线程分配sort_buffer_size = 8M# 此缓冲被使⽤来优化全联合(full JOINs 不带索引的联合).# 类似的联合在极⼤多数情况下有⾮常糟糕的性能表现,# 但是将此值设⼤能够减轻性能影响.# 通过 "Select_full_join" 状态变量查看全联合的数量# 当全联合发⽣时,在每个线程中分配join_buffer_size = 8M# 我们在cache中保留多少线程⽤于重⽤# 当⼀个客户端断开连接后,如果cache中的线程还少于thread_cache_size,# 则客户端线程被放⼊cache中.# 这可以在你需要⼤量新连接的时候极⼤的减少线程创建的开销# (⼀般来说如果你有好的线程模型的话,这不会有明显的性能提升.)thread_cache_size = 8# 此允许应⽤程序给予线程系统⼀个提⽰在同⼀时间给予渴望被运⾏的线程的数量.# 此值只对于⽀持 thread_concurrency() 函数的系统有意义( 例如Sun Solaris).# 你可可以尝试使⽤ [CPU数量]*(2..4) 来作为thread_concurrency的值thread_concurrency = 8# 查询缓冲常被⽤来缓冲 SELECT 的结果并且在下⼀次同样查询的时候不再执⾏直接返回结果.# 打开查询缓冲可以极⼤的提⾼服务器速度, 如果你有⼤量的相同的查询并且很少修改表.# 查看 "Qcache_lowmem_prunes" 状态变量来检查是否当前值对于你的负载来说是否⾜够⾼.# 注意: 在你表经常变化的情况下或者如果你的查询原⽂每次都不同,# 查询缓冲也许引起性能下降⽽不是性能提升.query_cache_size = 64M# 只有⼩于此设定值的结果才会被缓冲# 此设置⽤来保护查询缓冲,防⽌⼀个极⼤的结果集将其他所有的查询结果都覆盖.query_cache_limit = 2M# 被全⽂检索索引的最⼩的字长.# 你也许希望减少它,如果你需要搜索更短字的时候.# 注意在你修改此值之后,# 你需要重建你的 FULLTEXT 索引ft_min_word_len = 4# 如果你的系统⽀持 memlock() 函数,你也许希望打开此选项⽤以让运⾏中的mysql在在内存⾼度紧张的时候,数据在内存中保持锁定并且防⽌可能被swapping out# 此选项对于性能有益#memlock# 当创建新表时作为默认使⽤的表类型,# 如果在创建表⽰没有特别执⾏表类型,将会使⽤此值default_table_type = MYISAM# 线程使⽤的堆⼤⼩. 此容量的内存在每次连接时被预留.# MySQL 本⾝常不会需要超过64K的内存# 如果你使⽤你⾃⼰的需要⼤量堆的UDF函数# 或者你的操作系统对于某些操作需要更多的堆,# 你也许需要将其设置的更⾼⼀点.thread_stack = 192K# 设定默认的事务隔离级别.可⽤的级别如下:# READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLEtransaction_isolation = REPEATABLE-READ# 内部(内存中)临时表的最⼤⼤⼩# 如果⼀个表增长到⽐此值更⼤,将会⾃动转换为基于磁盘的表.# 此限制是针对单个表的,⽽不是总和.tmp_table_size = 64M# 打开⼆进制⽇志功能.# 在复制(replication)配置中,作为MASTER主服务器必须打开此项# 如果你需要从你最后的备份中做基于时间点的恢复,你也同样需要⼆进制⽇志.log-bin=mysql-bin# 如果你在使⽤链式从服务器结构的复制模式 (A->B->C),# 你需要在服务器B上打开此项.# 此选项打开在从线程上重做过的更新的⽇志,# 并将其写⼊从服务器的⼆进制⽇志.#log_slave_updates# 打开全查询⽇志. 所有的由服务器接收到的查询 (甚⾄对于⼀个错误语法的查询)# 都会被记录下来. 这对于调试⾮常有⽤, 在⽣产环境中常常关闭此项.#log# 将警告打印输出到错误log⽂件. 如果你对于MySQL有任何问题# 你应该打开警告log并且仔细审查错误⽇志,查出可能的原因.#log_warnings# 记录慢速查询. 慢速查询是指消耗了⽐ "long_query_time" 定义的更多时间的查询.# 如果 log_long_format 被打开,那些没有使⽤索引的查询也会被记录.# 如果你经常增加新查询到已有的系统内的话. ⼀般来说这是⼀个好主意,log_slow_queries# 所有的使⽤了⽐这个时间(以秒为单位)更多的查询会被认为是慢速查询.# 不要在这⾥使⽤"1", 否则会导致所有的查询,甚⾄⾮常快的查询页被记录下来(由于MySQL ⽬前时间的精确度只能达到秒的级别).long_query_time = 2# 在慢速⽇志中记录更多的信息.# ⼀般此项最好打开.# 打开此项会记录使得那些没有使⽤索引的查询也被作为到慢速查询附加到慢速⽇志⾥log_long_format# 此⽬录被MySQL⽤来保存临时⽂件.例如,# 它被⽤来处理基于磁盘的⼤型排序,和内部排序⼀样.# 以及简单的临时表.# 如果你不创建⾮常⼤的临时⽂件,将其放置到 swapfs/tmpfs ⽂件系统上也许⽐较好# 另⼀种选择是你也可以将其放置在独⽴的磁盘上.# 你可以使⽤";"来放置多个路径# 他们会按照roud-robin⽅法被轮询使⽤.#tmpdir = /tmp# *** 复制有关的设置# 唯⼀的服务辨识号,数值位于 1 到 2^32-1之间.# 此值在master和slave上都需要设置.# 如果 "master-host" 没有被设置,则默认为1, 但是如果忽略此选项,MySQL不会作为master⽣效.server-id = 1# 复制的Slave (去掉master段的注释来使其⽣效)## 为了配置此主机作为复制的slave服务器,你可以选择两种⽅法:## 1) 使⽤ CHANGE MASTER TO 命令 (在我们的⼿册中有完整描述) -# 语法如下:## CHANGE MASTER TO MASTER_HOST=<host>, MASTER_PORT=<port>,# MASTER_USER=<user>, MASTER_PASSWORD=<password> ;## 你需要替换掉 <host>, <user>, <password> 等被尖括号包围的字段以及使⽤master的端⼝号替换<port> (默认3306). ## 例⼦:## CHANGE MASTER TO MASTER_HOST='125.564.12.1', MASTER_PORT=3306,# MASTER_USER='joe', MASTER_PASSWORD='secret';## 或者## 2) 设置以下的变量. 不论如何, 在你选择这种⽅法的情况下, 然后第⼀次启动复制(甚⾄不成功的情况下,# 例如如果你输⼊错密码在master-password字段并且slave⽆法连接),# slave会创建⼀个 ⽂件,并且之后任何对于包含在此⽂件内的参数的变化都会被忽略# 并且由 ⽂件内的内容覆盖, 除⾮你关闭slave服务, 删除 并且重启slave 服务.# 由于这个原因,你也许不想碰⼀下的配置(注释掉的) 并且使⽤ CHANGE MASTER TO (查看上⾯) 来代替## 所需要的唯⼀id号位于 2 和 2^32 - 1之间# (并且和master不同)# 如果master-host被设置了.则默认值是2# 但是如果省略,则不会⽣效#server-id = 2## 复制结构中的master - 必须#master-host = <hostname>## 当连接到master上时slave所⽤来认证的⽤户名 - 必须#master-user = <username>## 当连接到master上时slave所⽤来认证的密码 - 必须#master-password = <password>## master监听的端⼝.# 可选 - 默认是3306#master-port = <port># 使得slave只读.只有⽤户拥有SUPER权限和在上⾯的slave线程能够修改数据.# 你可以使⽤此项去保证没有应⽤程序会意外的修改slave⽽不是master上的数据#read_only#*** MyISAM 相关选项# 关键词缓冲的⼤⼩, ⼀般⽤来缓冲MyISAM表的索引块.# 不要将其设置⼤于你可⽤内存的30%,# 因为⼀部分内存同样被OS⽤来缓冲⾏数据# 甚⾄在你并不使⽤MyISAM 表的情况下, 你也需要仍旧设置起 8-64M 内存由于它同样会被内部临时磁盘表使⽤. key_buffer_size = 32M# ⽤来做MyISAM表全表扫描的缓冲⼤⼩.# 当全表扫描需要时,在对应线程中分配.read_buffer_size = 2M# 当在排序之后,从⼀个已经排序好的序列中读取⾏时,⾏数据将从这个缓冲中读取来防⽌磁盘寻道.# 如果你增⾼此值,可以提⾼很多ORDER BY的性能.# 当需要时由每个线程分配read_rnd_buffer_size = 16M# MyISAM 使⽤特殊的类似树的cache来使得突发插⼊# (这些插⼊是,INSERT ... SELECT, INSERT ... VALUES (...), (...), ..., 以及 LOAD DATA# INFILE) 更快. 此变量限制每个进程中缓冲树的字节数.# 设置为 0 会关闭此优化.# 为了最优化不要将此值设置⼤于 "key_buffer_size".# 当突发插⼊被检测到时此缓冲将被分配.bulk_insert_buffer_size = 64M# 此缓冲当MySQL需要在 REPAIR, OPTIMIZE, ALTER 以及 LOAD DATA INFILE 到⼀个空表中引起重建索引时被分配. # 这在每个线程中被分配.所以在设置⼤值时需要⼩⼼.myisam_sort_buffer_size = 128M# MySQL重建索引时所允许的最⼤临时⽂件的⼤⼩ (当 REPAIR, ALTER TABLE 或者 LOAD DATA INFILE).# 如果⽂件⼤⼩⽐此值更⼤,索引会通过键值缓冲创建(更慢)myisam_max_sort_file_size = 10G# 如果被⽤来更快的索引创建索引所使⽤临时⽂件⼤于制定的值,那就使⽤键值缓冲⽅法.# 这主要⽤来强制在⼤表中长字串键去使⽤慢速的键值缓冲⽅法来创建索引.myisam_max_extra_sort_file_size = 10G# 如果⼀个表拥有超过⼀个索引, MyISAM 可以通过并⾏排序使⽤超过⼀个线程去修复他们.# 这对于拥有多个CPU以及⼤量内存情况的⽤户,是⼀个很好的选择.myisam_repair_threads = 1# ⾃动检查和修复没有适当关闭的 MyISAM 表.myisam_recover# 默认关闭 Federatedskip-federated# *** BDB 相关选项 ***# 如果你运⾏的MySQL服务有BDB⽀持但是你不准备使⽤的时候使⽤此选项. 这会节省内存并且可能加速⼀些事.skip-bdb# *** INNODB 相关选项 ***# 如果你的MySQL服务包含InnoDB⽀持但是并不打算使⽤的话,# 使⽤此选项会节省内存以及磁盘空间,并且加速某些部分#skip-innodb# 附加的内存池被InnoDB⽤来保存 metadata 信息# 如果InnoDB为此⽬的需要更多的内存,它会开始从OS这⾥申请内存.# 由于这个操作在⼤多数现代操作系统上已经⾜够快, 你⼀般不需要修改此值.# SHOW INNODB STATUS 命令会显⽰当先使⽤的数量.innodb_additional_mem_pool_size = 16M# InnoDB使⽤⼀个缓冲池来保存索引和原始数据, 不像 MyISAM.# 这⾥你设置越⼤,你在存取表⾥⾯数据时所需要的磁盘I/O越少.# 在⼀个独⽴使⽤的数据库服务器上,你可以设置这个变量到服务器物理内存⼤⼩的80%# 不要设置过⼤,否则,由于物理内存的竞争可能导致操作系统的换页颠簸.# 注意在32位系统上你每个进程可能被限制在 2-3.5G ⽤户层⾯内存限制,# 所以不要设置的太⾼.innodb_buffer_pool_size = 2G# InnoDB 将数据保存在⼀个或者多个数据⽂件中成为表空间.# 如果你只有单个逻辑驱动保存你的数据,⼀个单个的⾃增⽂件就⾜够好了.# 其他情况下.每个设备⼀个⽂件⼀般都是个好的选择.# 你也可以配置InnoDB来使⽤裸盘分区 - 请参考⼿册来获取更多相关内容innodb_data_file_path = ibdata1:10M:autoextend# 设置此选项如果你希望InnoDB表空间⽂件被保存在其他分区.# 默认保存在MySQL的datadir中.#innodb_data_home_dir = <directory># ⽤来同步IO操作的IO线程的数量. This value is# 此值在Unix下被硬编码为4,但是在Windows磁盘I/O可能在⼀个⼤数值下表现的更好.innodb_file_io_threads = 4# 如果你发现InnoDB表空间损坏, 设置此值为⼀个⾮零值可能帮助你导出你的表.# 从1开始并且增加此值知道你能够成功的导出表.#innodb_force_recovery=1# 在InnoDb核⼼内的允许线程数量.# 最优值依赖于应⽤程序,硬件以及操作系统的调度⽅式.# 过⾼的值可能导致线程的互斥颠簸.innodb_thread_concurrency = 16# 如果设置为1 ,InnoDB会在每次提交后刷新(fsync)事务⽇志到磁盘上,# 这提供了完整的ACID⾏为.# 如果你愿意对事务安全折衷, 并且你正在运⾏⼀个⼩的⾷物, 你可以设置此值到0或者2来减少由事务⽇志引起的磁盘I/O # 0代表⽇志只⼤约每秒写⼊⽇志⽂件并且⽇志⽂件刷新到磁盘.# 2代表⽇志写⼊⽇志⽂件在每次提交后,但是⽇志⽂件只有⼤约每秒才会刷新到磁盘上.innodb_flush_log_at_trx_commit = 1# 加速InnoDB的关闭. 这会阻⽌InnoDB在关闭时做全清除以及插⼊缓冲合并.# 这可能极⼤增加关机时间, 但是取⽽代之的是InnoDB可能在下次启动时做这些操作.#innodb_fast_shutdown# ⽤来缓冲⽇志数据的缓冲区的⼤⼩.# 当此值快满时, InnoDB将必须刷新数据到磁盘上.# 由于基本上每秒都会刷新⼀次,所以没有必要将此值设置的太⼤(甚⾄对于长事务⽽⾔)innodb_log_buffer_size = 8M# 在⽇志组中每个⽇志⽂件的⼤⼩.# 你应该设置⽇志⽂件总合⼤⼩到你缓冲池⼤⼩的25%~100%# 来避免在⽇志⽂件覆写上不必要的缓冲池刷新⾏为.# 不论如何, 请注意⼀个⼤的⽇志⽂件⼤⼩会增加恢复进程所需要的时间.innodb_log_file_size = 256M# 在⽇志组中的⽂件总数.# 通常来说2~3是⽐较好的.innodb_log_files_in_group = 3# InnoDB的⽇志⽂件所在位置. 默认是MySQL的datadir.# 你可以将其指定到⼀个独⽴的硬盘上或者⼀个RAID1卷上来提⾼其性能#innodb_log_group_home_dir# 在InnoDB缓冲池中最⼤允许的脏页⾯的⽐例.# 如果达到限额, InnoDB会开始刷新他们防⽌他们妨碍到⼲净数据页⾯.# 这是⼀个软限制,不被保证绝对执⾏.innodb_max_dirty_pages_pct = 90# InnoDB⽤来刷新⽇志的⽅法.# 表空间总是使⽤双重写⼊刷新⽅法# 默认值是 "fdatasync", 另⼀个是 "O_DSYNC".#innodb_flush_method=O_DSYNC# 在被回滚前,⼀个InnoDB的事务应该等待⼀个锁被批准多久.# InnoDB在其拥有的锁表中⾃动检测事务死锁并且回滚事务.# 如果你使⽤ LOCK TABLES 指令, 或者在同样事务中使⽤除了InnoDB以外的其他事务安全的存储引擎# 那么⼀个死锁可能发⽣⽽InnoDB⽆法注意到.# 这种情况下这个timeout值对于解决这种问题就⾮常有帮助.innodb_lock_wait_timeout = 120[mysqldump]# 不要在将内存中的整个结果写⼊磁盘之前缓存. 在导出⾮常巨⼤的表时需要此项quickmax_allowed_packet = 16M[mysql]no-auto-rehash# 仅仅允许使⽤键值的 UPDATEs 和 DELETEs .#safe-updates[isamchk]key_buffer = 512Msort_buffer_size = 512Mread_buffer = 8Mwrite_buffer = 8M[myisamchk]key_buffer = 512Msort_buffer_size = 512Mread_buffer = 8Mwrite_buffer = 8M[mysqlhotcopy]interactive-timeout[mysqld_safe]# 增加每个进程的可打开⽂件数量.# 警告: 确认你已经将全系统限制设定的⾜够⾼!# 打开⼤量表需要将此值设⾼open-files-limit = 8192。
Delphi TIniFile 类操作ini配置文件一、有必要了解INI文件的结构:;注释[小节名]关键字=值...---- INI文件允许有多个小节,每个小节又允许有多个关键字,“=”后面是该关键字的值。
---- 值的类型有三种:字符串、整型数值和布尔值。
其中字符串存贮在INI文件中时没有引号,布尔真值用1表示,布尔假值用0表示。
---- 注释以分号“;”开头。
二、定义---- 1、在Interface的Uses节增加IniFiles;---- 2、在Var变量定义部分增加一行:myinifile:Tinifile;---- 然后,就可以对变量myinifile进行创建、打开、读取、写入等操作了。
三、打开INI文件myinifile:=Tinifile.create('program.ini');--- 上面这一行语句将会为变量myinifile与具体的文件program.ini建立联系,然后,就可以通过变量myinifile,来读写program.ini文件中的关键字的值了。
---- 值得注意的是,如果括号中的文件名没有指明路径的话,那么这个Program.ini 文件会存储在Windows目录中,把Program.ini文件存储在应用程序当前目录中的方法是:为其指定完整的路径及文件名。
下面的两条语句可以完成这个功能:Filename:=ExtractFilePath(Paramstr(0))+'program.ini';myinifile:=Tinifile.Create(filename);四、读取关键字的值--- 针对INI文件支持的字符串、整型数值、布尔值三种数据类型,TINIfiles类提供了三种不同的对象方法来读取INI文件中关键字的值。
--- 假设已定义变量vs、vi、VB分别为string、integer、boolean类型。
vs:=myinifile.Readstring('小节名','关键字',缺省值);vi:=myinifile.Readinteger('小节名','关键字',缺省值);VB:=myinifile.Readbool('小节名','关键字',缺省值);--- 其中缺省值为该INI文件不存在该关键字时返回的缺省值。
使⽤QSettings操作INI配置⽂件环境:Win10+VS2015+Qt5.9.8C++代码:// 配置⽂件:可执⾏路径\config\main.ini,如果没有config⼦⽬录会⾃动创建QSettings settings(QString("%1%2").arg(QCoreApplication::applicationDirPath(), "\\config\\main.ini"), QSettings::Format::IniFormat);settings.clear(); // 清除已有的所有配置,慎⽤settings.setValue("Key1", "Value1"); // 缺省Section是[General]settings.setValue("Key2", true);settings.setValue("Key3", "中⽂"); // 中⽂保存编码值\x4e2d\x6587settings.setValue("Section1/Key1", "Value1");settings.setValue("Section1/Key2", true);settings.setValue("Section1/Key3", "中⽂");settings.setValue("Section2/Key1", "Value1");settings.setValue("Section2/Key2", true);settings.setValue("Section2/Key3", "中⽂,Eng,\"Eng\"");QString s = settings.value("Key3").toString();LOG_INFO("值:" << s.toStdString().c_str());// 存取列表QList<QVariant> list1 = { 1, "A,B", "我,你" };settings.setValue("Section2/Key4", QVariant(list1));QList<QVariant> list2 = settings.value("Section2/Key4").toList();// 存取键值对QMap<QString, QVariant> map1 = { { "mapkey1", 1 },{ "mapkey2", "哈哈" } };settings.setValue("Section2/Key5", QVariant(map1));QMap<QString, QVariant> map2 = settings.value("Section2/Key5").toMap();对应INI⽂件:[General]Key1=Value1Key2=trueKey3=\x4e2d\x6587[Section1]Key1=Value1Key2=trueKey3=\x4e2d\x6587[Section2]Key1=Value1Key2=trueKey3="\x4e2d\x6587,Eng,\"Eng\""Key4=1, "A,B", "\x6211,\x4f60"Key5=@Variant(\0\0\0\b\0\0\0\x2\0\0\0\xe\0m\0\x61\0p\0k\0\x65\0y\0\x32\0\0\0\n\0\0\0\x4T\xc8T\xc8\0\0\0\xe\0m\0\x61\0p\0k\0\x65\0y\0\x31\0\0\0\x2\0\0\0\x1)。
mfc 修改.ini文件的方法小伙伴们!今天咱就来唠唠这个mfc修改.ini文件的事儿。
这东西啊,刚开始接触的时候可能会觉得有点头疼,不过别担心,等咱把它搞明白,那就是小菜一碟啦!一、了解.ini文件。
.ini文件其实就是一种配置文件,它里面存储着程序的各种配置信息,就像是一个小仓库,里面放着程序运行需要的各种“小零件”。
比如说,一个软件的窗口大小、字体颜色这些设置,可能就会存放在.ini文件里。
咱要修改它,就得先知道它长啥样,对吧?一般来说,.ini文件是文本格式的,咱可以用记事本之类的软件打开它,看看里面都藏了些啥。
二、在MFC中读取.ini文件。
咱得先学会怎么把.ini文件里的信息读出来,这就好比要从仓库里把东西拿出来看看。
在MFC里,有专门的函数可以用来读取.ini文件哦。
比如说GetPrivateProfileString这个函数,它就挺好用的。
这个函数的用法大概是这样的:它有好几个参数,第一个参数是.ini文件的节名,就像是仓库里的一个个小格子,每个格子都有个名字,咱得告诉它咱要从哪个格子里拿东西。
第二个参数是键名,这就好比是小格子里放的一个个小盒子,每个盒子也有个名字,咱得指定要拿哪个盒子里的东西。
第三个参数是用来接收读取到的值的缓冲区,也就是咱把东西拿出来后放的地方。
第四个参数是缓冲区的大小,得告诉它这个地方能放多少东西,不然它可不知道哦。
第五个参数是.ini文件的路径,如果咱不指定的话,它会默认在当前目录下找。
举个例子哈,假如咱有个.ini文件,里面有个节叫[Settings],在这个节里有个键叫“FontSize”,咱想把这个键对应的值读出来,代码可能就像这样:cpp.TCHAR buffer[256];GetPrivateProfileString(_T("Settings"), _T("FontSize"), _T(""), buffer, 256, _T("myconfig.ini"));这里面_T是为了支持Unicode编码哈,咱不用太纠结这个,就知道这么写就行啦。
C++操作.ini配置文件的API2009年12月09日星期三上午 11:05概述在程序中经常要用到设置或者其他少量数据的存盘,以便程序在下一次执行的时候可以使用,比如说保存本次程序执行时窗口的位置、大小、一些用户设置的数据等等,在 Dos 下编程的时候,我们一般自己产生一个文件,由自己把这些数据写到文件中,然后在下一次执行的时候再读出来使用。
在 Win32 编程中当然你也可以这样干,但 Windows 已经为我们提供了两种方便的办法,那就是使用注册表或者 ini 文件(Profile)来保存少量数据。
本文中先介绍一下 .ini 文件的使用。
ini 文件是文本文件,中间的数据格式一般为:[Section1 Name]KeyName1=value1KeyName2=value2...[Section2 Name]KeyName1=value1KeyName2=value2ini 文件可以分为几个 Section,每个 Section 的名称用 [] 括起来,在一个 Section 中,可以有很多的 Key,每一个 Key 可以有一个值并占用一行,格式是 Key=value,Win32 对 ini 文件操作的 api 中,有一部分是对 win.ini 操作的,有一部分是对用户自定义的 ini 文件操作的。
Win.in 和system.ini 是Windows的两个非常重要的初始化文件,Windows将用户所作的选择以及各种变化的系统信息记录在这两个文件中。
System.ini 描述了系统硬件的当前状态,Win.ini 文件则包含了Windows 系统运行环境的当前配置。
由于 Win.ini 文件的重要性和常用性,Win32 中有专门对 Win.ini 进行操作的 api,它们是:GetProfileInt - 从 Win.ini 文件的某个 Section 取得一个 key 的整数值,它的原形是:GetProfileInt(LPCTSTR lpAppName, // 指向包含 Section 名称的字符串地址LPCTSTR lpKeyName, // 指向包含 Key 名称的字符串地址INT nDefault // 如果 Key 值没有找到,则返回缺省的值是多少);如果 Key 值没有找到的话,返回值是 nDefault 指定的缺省值,如果 Key 中的值是负数,则返回 0,如果 Key 指定的是数字和字符串的混合,则返回数字部分的值,比如说 x=1234abcd,则返回 1234GetProfileString - 从 Win.ini 文件的某个 Section 取得一个 key 的字符串,它的原形是:GetProfileString(LPCTSTR lpAppName, // 指向包含 Section 名称的字符串地址LPCTSTR lpKeyName, // 指向包含 Key 名称的字符串地址LPCTSTR lpDefault, // 如果 Key 值没有找到,则返回缺省的字符串的地址LPTSTR lpReturnedString, // 返回字符串的缓冲区地址DWORD nSize // 缓冲区的长度);返回的字符串在缓冲区内,返回的 eax 值是返回的字符串的长度(不包括尾部的0)GetProfileSection - 从 Win.ini 文件中读出整个 Section 的内容,它的原形是:GetProfileSection(LPCTSTR lpAppName, // 指向包含 Section 名称的字符串地址LPTSTR lpReturnedString, // 返回数据的缓冲区地址DWORD nSize // 返回数据的缓冲区长度);WriteProfileSection - 将一个整个 Section 的值写入 Win.ini 文件的指定 Section 中,它的原形是:WriteProfileSection(LPCTSTR lpAppName, // 指向包含 Section 名称的字符串地址LPCTSTR lpString // 要写入的数据的地址);如果 Win.ini 没有指定的 Section,API 会新建立一个并写入数据,如果已经存在,则先删除原来Seciton 中所有的 Key 值然后写入新的。
WriteProfileString - 将一个 Key 值写入 Win.ini 文件的指定 Section 中,它的原形是:WriteProfileString(LPCTSTR lpAppName, // 指向包含 Section 名称的字符串地址LPCTSTR lpKeyName, // 指向包含 Key 名称的字符串地址LPCTSTR lpString // 要写的字符串地址);如果 Win.ini 没有指定的 Section,API 会新建 Section,如果没有指定的 Key 则新建一个 Key 并写入数据,如果已经存在,则用字符串代替原来的值。
以上的 Api 是对 Win.ini 操作的,当然对于我们来说,用的更多的是在程序运行的目录中建立自己的ini 文件,如果需要对自己的 ini 文件操作,就要用到另一组 Api,这一组 api 和上面的很象,只要把上面一组的 Profile 换成 PrivateProfile(私有的)就可以了,参数中也相应的多了一个 ini 文件名的参数。
例如 GetPrivateProfileInt、GetPrivateProfileSection、WritePrivateProfileString 等等,下面分别介绍:GetPrivateProfileInt - 从 ini 文件的某个 Section 取得一个 key 的整数值,它的原形是:GetPrivateProfileInt(LPCTSTR lpAppName, // 指向包含 Section 名称的字符串地址LPCTSTR lpKeyName, // 指向包含 Key 名称的字符串地址INT nDefault // 如果 Key 值没有找到,则返回缺省的值是多少LPCTSTR lpFileName // ini 文件的文件名);中间参数和返回值的定义和 GetProfileInt 是一样的。
GetPrivateProfileString - 从 ini 文件的某个 Section 取得一个 key 的字符串,它的原形是:GetPrivateProfileString(LPCTSTR lpAppName, // 指向包含 Section 名称的字符串地址LPCTSTR lpKeyName, // 指向包含 Key 名称的字符串地址LPCTSTR lpDefault, // 如果 Key 值没有找到,则返回缺省的字符串的地址LPTSTR lpReturnedString, // 返回字符串的缓冲区地址DWORD nSize // 缓冲区的长度LPCTSTR lpFileName // ini 文件的文件名);GetPrivateProfileSection - 从 ini 文件中读出整个 Section 的内容,它的原形是:GetPrivateProfileSection(LPCTSTR lpAppName, // 指向包含 Section 名称的字符串地址LPTSTR lpReturnedString, // 返回数据的缓冲区地址DWORD nSize // 返回数据的缓冲区长度LPCTSTR lpFileName // ini 文件的文件名);这个 api 可以读出整个 section 的内容,当你不知道 section 中有哪些 key 的时候,可以使用这个api 将整个 section 读出后再处理。
GetPrivateProfileSectionNames - 从 ini 文件中获得 Section 的名称,它的原形是:GetPrivateProfileSectionNames(LPTSTR lpszReturnBuffer, // 返回数据的缓冲区地址DWORD nSize // 返回数据的缓冲区长度LPCTSTR lpFileName // ini 文件的文件名);如果 ini 中有两个 Section: [sec1] 和 [sec2],则返回的是 'sec1',0,'sec2',0,0 ,当你不知道 ini 中有哪些 section 的时候可以用这个 api 来获取名称WritePrivateProfileSection - 将一个整个 Section 的内容入 ini 文件的指定 Section 中,它的原形是:WritePrivateProfileSection(LPCTSTR lpAppName, // 指向包含 Section 名称的字符串地址LPCTSTR lpString // 要写入的数据的地址LPCTSTR lpFileName // ini 文件的文件名);WritePrivateProfileString - 将一个 Key 值写入 ini 文件的指定 Section 中,它的原形是:WritePrivateProfileString(LPCTSTR lpAppName, // 指向包含 Section 名称的字符串地址LPCTSTR lpKeyName, // 指向包含 Key 名称的字符串地址LPCTSTR lpString // 要写的字符串地址LPCTSTR lpFileName // ini 文件的文件名);如果 ini 中没有指定的 Section,API 会新建 Section,如果没有指定的 Key 则新建一个 Key 并写入数据,如果已经存在,则用字符串代替原来的值。
当指定的 ini 也不存在的时候,API 会自动建立一个新的文件,所以使用 ini 的好处是我们不必为了保存少量的数据涉及到文件操作,就连查找文件是否存在的操作都不必要。
使用要点:在我们实际使用的时候,用的最多的是 GetPrivateProfileString 和 WritePrivateProfileString,但在对自定义 ini 文件操作的时候要注意的是,如果 lpFileName 指定的文件没有路径的话,Api 会去Windows 的安装目录去找而不会在当前目录找,但是每次用到 ini 函数要获取当前路径显然太麻烦了,这里有一个变通的办法,你只要在 ini 文件名前面加上 .\ 就可以了,比如说要对本目录下的 user.ini 操作,那么文件名就是 '.\user.ini' 这样显然比较方便。