VC操作INI文件
C语言读取写入ini配置文件的方法实现
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 内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。
ini文件写法
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文件的基本写法包括节、键和值三个部分,可以通过组合这些基本元素来表示复杂的配置信息。
在实际使用中,可以根据需要创建多个节和键,以满足不同程序的配置需求。
VC++中ini文件加密解密
j += (BYTE)S.GetAt(2*i+1)-65;
str="1"; // 设置str长度为1
str.SetAt(0, j);
Result+=str; // 追加字符,还原字符串
}
S=Result; // 保存中间结果
for(i=0; i<S.GetLength(); i++) // 依次对字符串中各字符进行操作
str.SetAt(0, 65+j/26);//这里将65改大点的数例如256,密文就会变乱码,效果更好,相应的,解密处要改为相同的数
str.SetAt(1, 65+j%26);
Result += str;
}
return Result;
}
CString Decrypt(CString S, WORD Key) // 解密函数
Result=S; // 初始化结果字符串
for(i=0; i<S.GetLength(); i++) // 依次对字符串中各字符进行操作
{
Result.SetAt(i, S.GetAt(i)^(Key>>8)); // 将密钥移位后与字符异或
Key = ((BYTE)Result.GetAt(i)+Key)*C1+C2; // 产生下一个密钥
{
CString Result,str;
int i,j;
Result.Empty(); // 清除结果
for(i=0; i < S.GetLength()/2; i++) // 将字符串两个字母一组进行处理
C++INI配置文件
C++INI配置文件使用INI配置文件在BCB中有个TIniFile类,它提供了对INI文件的操作,INI文件一种通用的配置文件格式它也象注册表一样分键和数据项,下面是一个INI配置文件的内容,它有一个键LastConfig,在这个键下有一个数据项DefaultDit,在数据项后面就是这个数据项的值。
[LastConfig] DefaultDir=E:\xxxTIniFile类有几个常用的方法给大家介绍一下:__fastcall TIniFile(const AnsiString FileName) : Inifiles::TCustomIniFile(FileName) { }这个方法创建一个INI对象,如果FileName指定的文件名不存在则自动生成此文件,FileName可以用全路径,指定INI文件的地点,如果只有文件名没有路径,这个函数将到Windows系统路径下去打开或创建。
(WIN9X是Windows目录,NT和2000是WINNT目录)bool __fastcall SectionExists(const AnsiString Section);这个方法判断是否存在Section这个键。
virtual AnsiString __fastcall ReadString(const AnsiString Section, const AnsiString Ident, const AnsiString Default);这个方法从INI文件中读取一个字符串,Section是指定的键,Ident是指定键下的数据项Default是如果这个项不存在的时候的默认值。
virtual void __fastcall WriteString(const AnsiString Section, const AnsiString Ident, const AnsiString Value);这个方法是向INI文件中写入一个字符串,Senction是指定的键,Ident是指定的数据项,Value是要写入的数据。
ini文件只知道节名,读取节下所有值的方法qt
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文件中某个节下的所有键值对。
VC中文件名后缀大全
VC中文件名后缀大全.C:用C语言编写的源代码文件。
.H、.HPP或.HXX:用C/C++语言编写的头文件,通常用来定义数据类型,声明变量、函数、结构和类。
.OBJ:由编译器或汇编工具生成的目标文件,是模块的二进制中间文件。
.PLG:编译信息文件,编译时的error和warning 信息文件。
.CPP或.CXX:用C++语言编写的源代码文件。
.NCB:NCB是“No Compile Browser”的缩写,其中存放了供ClassView、WizardBar和Component Gallery使用的信息,由VC开发环境自动生成。
无编译浏览文件。
当自动完成功能出问题时可以删除此文件。
编译工程后会自动生成。
.CLW:ClassWizard生成的用来存放类信息的文件。
classwizard信息文件,ini文件的格式。
.DSW:VC开发环境生成的WorkSpace文件,用来把多个工程组织到一个WorkSpace中。
工作区文件,与.dsp差不多。
.DSP:VC开发环境生成的工程文件,VC4及以前版本使用MAK文件来定义工程。
项目文件,文本格式。
.SLN:是在开发环境中使用的解决方案文件。
它将一个或多个项目的所有元素组织到单个的解决方案中。
此文件存储在父项目目录中.解决方案文件,他是一个或多个.proj(项目)的集合。
.SUO:解决方案用户选项记录所有将与解决方案建立关联的选项,以便在每次打开时,它都包含您所做的自定义设置。
比如你的VS布局,你的项目最后编译的而又没有关掉的文件(下次打开时用).VCPROJ:工程文件。
.MDP:旧版本的项目文件,相当于.dsp。
.LIB:库文件,LINK工具将使用它来连接各种输入库,以便最终生成EXE文件。
.PCH:预编译头文件,比较大,由编译器在建立工程时自动生成,其中存放有工程中已经编译的部分代码,在以后建立工程时不再重新编译这些代码,以便加快整个编译过程的速度。
.RC:资源定义文件。
VC++遍历INI文件
char strBuffer[128]; //临时缓冲区,用于接收字符串
char strSection[128]; //用于接收节点名称 #34;.\\UnitInfo.INI"); //INI文件位于VC++工程的根目录
//获取第一个节点名
结合MSDN对这几个函数的介绍,很容易想到的是,使用GetPrivateProfileSectionNames函数获取节点名称,以此作为参数给GetPrivateProfileString函数,读取第一个关键字名称,接着再读取该关键字下的值。代码如下:
char strSection[128];
WritePrivateProfileString(strSection,strUnitID,NULL,strFileName);
细心的您可能会问,怎么可以将配置文件信息都删除了,如此一来,程序下一次运行岂不是读不到信息?别急,在我们读完所需要的所有配置信息后,我们必须重建该配置文件。如何重建?只需循环调用WritePrivateProfileString函数。代码如下:
DWORD nChar = GetPrivateProfileSectionNames(strSection,sizeof(strSection),strFileName);
for (int i = 0; i < g_UnitNumber; i++)
{
//保存探头标识
nChar = GetPrivateProfileString(strSection,NULL,"",strBuffer,sizeof(strBuffer),strFileName);
g_UnitID[i] = strBuffer;
VC各文件类型作用大全
*.bsc:是用于浏览项目信息的,如果用Source Brower的话就必须有这个文件。如果不用这个功能的话,可以在Project Options里面去掉Generate Browse Info File,可以加快编译速度。
debug和release区别:
Debug通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。Release称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。Debug 和 Release 的真正秘密,在于一组编译选项。下面列出了分别针对二者的选项(当然除此之外还有其他一些,如/Fd /Fo,但区别并不重要,通常他们也不会引起 Release 版错误,在此不讨论)Debug 版本参数 含义 /MDd /MLd 或 /MTd 使用 Debug runtime library (调试版本的运行时刻函数库) /Od 关闭优化开关 /D "_DEBUG" 相当于 #define _DEBUG,打开编译调试代码开关 (主要针对assert函数) /ZI 创建 Edit and continue(编辑继续)数据库,这样在调试过程中如果修改了源代码不需重新编译 /GZ 可以帮助捕获内存错误 /Gm 打开最小化重链接开关, 减少链接时间 Release 版本 参数 含义 /MD /ML 或 /MT 使用发布版本的运行时刻函数库 /O1 或 /O2 优化开关,使程序最小或最快 /D "NDEBUG" 关闭条件编译调试代码开关 (即不编译assert函数) /GF 合并重复的字符串, 并将字符串常量放到只读内存, 防止被修改 实际上,Debug 和 Release
ini文件用法
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文件时,需要特别注意文件的来源和内容的合法性,以避免安全漏洞。
VC中操作INI文件的函数
Name=tian"0Age=20"0Sex=man"0"0(每条以"0分割,最后以两个"0结束)
而我们是想等到每个key及其对应的值,那怎么分割上面那个字符串呢?在VB有中个叫Split()函数,用起来很方便,但是vc里面没有。
当然,你也可以在VC中去实现一个Split()函数,不过我在这里提供一个简单的方法:
);
这个 api 可以读出整个 section 的内容,当你不知道 section 中有哪些 key 的时候,可以使用这个 api 将整个 section 读出后再处理。
说明:
例ini文件为:
[student]
Name=tian
Age=20
Sex=man
由GetPrivateProfileSection()函数第二个参数lpReturnedString 返回的字符串如下:
WriteProfileString(
LPCTSTR lpAppName, // 指向包含 Section 名称的字符串地址
LPCTSTR lpKeyName, // 指向包含 Key 名称的字符串地址
LPCTSTR lpString // 要写的字符串地址
);
如果 Win.ini 没有指定的 Section,API 会新建 Section,如果没有指定的 Key 则新建一个 Key 并写入数据,如果已经存在,则用字符串代替原来的值。
INT nDefault // 如果 Key 值没有找到,则返回缺省的值是多少
);
如果 Key 值没有找到的话,返回值是 nDefault 指定的缺省值,如果 Key 中的值是负数,则返回 0,如果 Key 指定的是数字和字符串的混合,则返回数字部分的值,比如说 x=1234abcd,则返回 1234
c#操作ini文件
无论在web还是在窗体程序的时候,可能都需要配置文件来保存一些数据,比如登陆QQ 的时候保存帐号密码,网站的保存(网站使用的是cookie与本文无关),那么他们是怎么保存的呢?其实就是创建文件,文字流写入进文件。
就是这么简单。
有人会问,那数据不是不安全了么?我想里面保存的数据安不安全完全看你用什么方式来加密跟创建文件毫无关系。
那么接下来,就用简单的方式来操作配置文件的写法。
代码如下那么如果文件存在了怎么办?根据我现在的业务需求就是如果有配置文件那就读取配置文件的信息操作ini文件的时候我们需要调用win apiDllImport是最常见的就是使用它来调用WIN32的API,例如上面所示。
extern 修饰符用于声明在外部实现的方法。
extern 修饰符的常见用法是在使用Interop 服务调入非托管代码时与DllImport 属性一起使用。
INI文件格式是某些平台或软件上的配置文件的非正式标准,以节(section)和键(key)构成,常用于微软Windows操作系统中。
这种配置文件的文件扩展名多为INI,故名。
INI是英文“初始化”(initialization)的缩写。
正如该术语所表示的,INI文件被用来对操作系统或特定程序初始化或进行参数设置。
因为默认创建的是空的配置文件,我们先手动的添加一些东西,[config]的意识是节点名称,类似xml的的节点读取的方式这里的路径我们要写绝对路径,系统要求的,相对路径会查不到。
好了运行后我们会得到UserID这个key的value的值可以试一试哟那么有读取了,上图是读取一个节点,那么如果很多节点写起来就麻烦了很多,我们把这个读的方法抽取出来读取的方式我们搞定了,那么我们来画个窗体做写入事件。
写入的系统函数写入的系统函数写入的系统函数写入方法写入也搞定了,那在窗体界面上我们看到了有一个单选框是否保存密码,大家应该知道怎么做了吧?就到这里~~有问题可以回复,有时间就解答。
INI文件格式及其操作代码
INI⽂件格式及其操作代码INI⽂件格式如下:[Database]server=wlqdatabase=mydatabaseuid=sapwd=123456说明:(有4个key)Section为:DatabaseKey为:server database uid pwd/***************代码******************/using System;using System.IO;using System.Runtime.InteropServices;using System.Text;namespace Sx_Mdi{/// <summary>/// Summary description for Class1./// </summary>public class IniFile{//⽂件INI名称public string Path;////声明读写INI⽂件的API函数[DllImport("kernel32")]private static extern long WritePrivateProfileString(string section,string key,string val,string filePath);[DllImport("kernel32")]private static extern int GetPrivateProfileString(string section,string key,string def,StringBuilder retVal,int size,string filePath); //类的构造函数,传递INI⽂件名public IniFile(string inipath){//// TODO: Add constructor logic here//Path = inipath;}//写INI⽂件public void IniWriteValue(string Section,string Key,string Value){WritePrivateProfileString(Section,Key,Value,this.Path);}//读取INI⽂件指定public string IniReadValue(string Section,string Key){StringBuilder temp = new StringBuilder(255);int i = GetPrivateProfileString(Section,Key,"",temp,255,this.Path);return temp.ToString();}}}操作范例:public static SqlConnection MyConnection(){string sPath;string ServerName,userId,sPwd,DataName;sPath = GetPath();IniFile ini = new IniFile(sPath);ServerName = ini.IniReadValue ("Database","server");userId = ini.IniReadValue ("Database","uid");sPwd = ini.IniReadValue ("Database","pwd");DataName = ini.IniReadValue ("Database","database");string strSql = "server =" + ServerName+";uid ="+ userId +";pwd =;database ="+ DataName; SqlConnection myConn=new SqlConnection(strSql); return myConn;}/***************代码******************/。
VC操作INI
用VC操作ini配置文件2009年02月13日星期五 10:27Windows操作系统专门为此提供了6个API函数来对配置设置文件进行读、写:GetPrivateProfileInt() 从私有初始化文件获取整型数值GetPrivateProfileString() 从私有初始化文件获取字符串型值GetProfileInt 从win.ini 获取整数值GetProfileString 从win.ini 获取字符串值WritePrivateProfileString 写字符串到私有初始化文件WriteProfileString 写字符串到win.ini我们可以把视图类的:OnInitialUpdate() 函数作为程序启动时读取配置文件的入口,配置文件的存储格式如下:[SECTION 1]XPos=300YPos=200[SECTION 2]Text=Hello仅有两个节,XPos和YPos标明了待显示信息的坐标,而待显示的信息存储在第二节的Text项中,用读取访问私有配置设置文件的API函数将其分别读入到变量m_nXPos,m_nYPos和m_strText中,并通过Invalidate()调用OnDraw()函数,在其内用TextOut函数将该信息在读取的坐标位置显示出来:m_nXPos=GetPrivateProfileInt("SECTION 1", //节名"XPos", //项名0, //没找到此项时的缺省返回值"C:\test\debug\test.ini"); //配置文件的准确路径m_nYPos=GetPrivateProfileInt("SECTION 1","YPos",0,exeFullPath);char buf[256];len=GetPrivateProfileString("SECTION 2", //节名"Text", //项名"No Text", //没找到此项时的返回值buf, //目标缓冲区地址256, //目标缓冲区长度"C:\test\debug\test.ini"); //配置文件的准确路径for(int i=0;i<len;i++){CString str;str.Format("%c",buf[i]);m_strText+=str;}Invalidate();一般配置文件是和应用程序存放在同一个目录中的如果用"C:\test\debug\test.ini"的绝对路径进行设置就会出现路径改变后找不到配置文件的问题,所以应动态搜寻配置文件的存放地址:Tchar exeFullPath[MAX_PATH]; // MAX_PATH在API中有定义,为128int len=GetModuleFileName(NULL,exeFullPath, //应用程序的全路径存放地址MAX_PATH);CString path="\test.ini"; //配置文件名::strcpy(exeFullPath+len-13,path); //组合出配置文件的全路径写配置文件也基本类似,只是需要把数值类型的变量格式化成字符串再行存储:str.Format("%d",m_nXPos);WritePrivateProfileString("SECTION 1","XPos",str,exeFullPath);str.Format("%d",m_nYPos);WritePrivateProfileString("SECTION 1","YPos",str,exeFullPath); WritePrivateProfileString("SECTION 2","Text",m_strText,exeFullPath);我们一定遇到过这样的程序:在执行过一遍以后,重启系统会自动加载该程序,其实除了在启动菜单和注册表添加信息外,也可以用 WriteProfileString()函数向win.ini的"windows"节的"run"项目添加应用程序的全路径来实现,这要比其它两种方法简便的多,而且也比较安全。
ini文件写法
ini文件写法摘要:一、ini文件的概述1.ini文件的概念2.ini文件的作用3.ini文件的组成部分二、ini文件的写法1.创建ini文件的基本结构2.设置键值对3.注释的使用4.格式规范三、ini文件的读取1.读取ini文件的方法2.解析ini文件的内容3.获取和处理键值对四、ini文件的常见应用场景1.配置文件的存储和读取2.应用程序的参数设置3.开发中的数据存储和读取正文:ini文件是一种配置文件格式,常用于存储和读取应用程序的配置信息。
它的组成部分主要包括节(section)、键(key)和值(value)。
在ini文件中,节用方括号[]括起来,键和值用等号=连接。
此外,ini文件允许使用注释,注释以分号;开始,直到行末尾。
ini文件的写法比较简单。
首先,需要创建一个基本的文件结构,包括文件名和扩展名.ini。
然后,根据需要设置键值对,例如:```[section1]key1=value1key2=value2[section2]key3=value3```在ini文件中,可以使用注释来对配置信息进行说明。
注释以分号;开始,直到行末尾,例如:```; 这是一个注释[section1]key1=value1key2=value2```要读取ini文件,可以使用编程语言提供的相应方法。
例如,在Python 中,可以使用configparser库来实现ini文件的读取。
首先,需要安装configparser库,然后按照以下步骤进行操作:```pythonimport configparser# 创建一个ConfigParser对象config = configparser.ConfigParser()# 读取ini文件config.read("example.ini")# 获取和处理键值对print(config.get("section1", "key1")) # 输出:value1print(config.getint("section1", "key2")) # 输出:2```ini文件在实际应用中有很多场景,如存储和读取配置信息、设置应用程序参数、开发过程中的数据存储和读取等。
ini文件编写方法
ini文件编写方法一。
ini 文件是一种常见的配置文件格式,在很多软件和系统中都有广泛应用。
要编写一个好的 ini 文件,首先得搞清楚它的基本结构。
1.1 ini 文件通常由节(Section)和键值对(Key-Value Pair)组成。
节就像是一个个分类的文件夹,而键值对则是在这些文件夹里存放的具体信息。
比如说,[Settings] 这就是一个节的名称。
1.2 键值对呢,就是像“Key=Value”这样的形式。
比如说“FontSize=12”,“FontSize”是键,“12”就是值。
二。
在编写 ini 文件时,有一些要点得特别注意。
2.1 命名要清晰明了。
节名和键名都得让人一眼就能看出它是干啥的。
别整那些让人摸不着头脑的名字,不然回头自己都搞不清楚。
2.2 格式要规范。
每行一个键值对,别乱糟糟的,不然读起来就跟一团乱麻似的。
2.3 注释也很重要。
有时候给自己或者别人留个注释,说明一下这个键值是干啥用的,为啥这么设置,能省不少事儿。
三。
再来说说怎么修改和读取 ini 文件。
3.1 有很多编程语言都能处理 ini 文件。
比如说 Python 就有专门的库来读取和修改 ini 文件,用起来挺方便的。
3.2 但不管用啥方法,都得小心谨慎,别一不小心把重要的配置给改坏了,那可就麻烦大了。
编写 ini 文件虽然不算特别复杂,但也得用心去做,才能让它发挥应有的作用。
就像盖房子,基础打牢了,房子才能结实。
可别马马虎虎,不然到时候出了问题,就得返工,费时又费力!。
ini文件赋值参数路径
ini文件赋值参数路径INI文件是一种常见的配置文件格式,通常用于存储程序的配置信息。
在INI文件中,参数赋值的路径通常是通过键值对的方式进行设置。
下面我将从多个角度来说明INI文件中参数赋值的路径。
1. 基本格式:INI文件中的参数赋值路径一般遵循以下基本格式:key = value.其中,key表示参数的名称,value表示参数的值。
在INI文件中,可以通过这种方式来为程序设置各种配置信息。
2. 路径表示,在INI文件中,参数赋值的路径通常是相对于INI文件所在的路径来进行设置的。
如果需要使用绝对路径,可以在value中直接指定完整的路径信息。
3. 路径分隔符,在INI文件中,路径分隔符通常使用正斜杠(/)或反斜杠(\)来表示路径的不同部分。
例如,在Windows系统中,常见的路径表示方式为C:\Program Files\example.ini,而在类Unix系统中则为/usr/local/example.ini。
4. 特殊字符处理,在INI文件中,如果参数值中包含特殊字符,可以使用转义字符来进行处理。
例如,如果参数值中包含等号(=)或分号(;),可以使用转义字符来表示这些特殊字符,以避免与参数赋值的语法产生冲突。
5. 路径引号,在INI文件中,如果参数值中包含空格或其他特殊字符,可以使用双引号或单引号来将参数值括起来,以确保路径能够正确解析。
总的来说,INI文件中的参数赋值路径是通过键值对的方式来设置的,通常需要考虑路径表示、路径分隔符、特殊字符处理和路径引号等方面的内容。
希望以上回答能够帮助到你。
C#操作ini(读取、写入)
C#操作ini(读取、写⼊)C#操作ini(读取、写⼊)INI⽂件是⼀种按照特点⽅式排列的⽂本⽂件,该⽂件主要存放⽤户所做的选择以及系统的各种参数。
⽤户可以通过修改INI⽂件,来改变应⽤程序和系统的很多配置。
但⾃从Windows 95的退出,在Windows系统中引⼊了注册表的概念,INI⽂件在Windows系统的地位就开始不断下滑,这是因为注册表的独特优点,使应⽤程序和系统都把许多参数和初始化信息放进了注册表中。
但在某些场合,INI⽂件还拥有其不可替代的地位。
INI⽂件的结构INI⽂件是⼀种按照特点⽅式排列的⽂本⽂件。
每⼀个INI⽂件构成都⾮常类似,由若⼲段落(section)组成,在每个带括号的标题下⾯,是若⼲个以单个单词开头的关键词(keyword)和⼀个等号,等号右边的就是关键字对应的值(value)。
其⼀般形式如下:[Section1] KeyWord1 = Valuel KeyWord2 = Value2 ...... [Section2] KeyWord3 = Value3 KeyWord4 = Value4[DllImport("kernel32")]private static extern int GetPrivateProfileString(string section, string key, string defVal, StringBuilder retVal, int size, string filePath);注:section:要读取的段落名key: 要读取的键defVal: 读取异常的情况下的缺省值retVal: key所对应的值,如果该key不存在则返回空值size: 值允许的⼤⼩filePath: INI⽂件的完整路径和⽂件名[DllImport("kernel32")]private static extern long WritePrivateProfileString(string section, string key, string val, string filePath);注:section: 要写⼊的段落名key: 要写⼊的键,如果该key存在则覆盖写⼊val: key所对应的值filePath: INI⽂件的完整路径和⽂件名/// <summary>/// 读取INI⽂件/// </summary>/// <param name="section">项⽬名称(如 [section] )</param>/// <param name="skey">键</param>/// <param name="path">路径</param>public string IniReadValue(string section, string skey, string path){StringBuilder temp = new StringBuilder(500);int i = GetPrivateProfileString(section, skey, "", temp, 500, path);return temp.ToString();}/// <summary>/// 写⼊ini⽂件/// </summary>/// <param name="section">项⽬名称</param>/// <param name="key">键</param>/// <param name="value">值</param>/// <param name="path">路径</param>public void IniWrite(string section, string key, string value,string path) {WritePrivateProfileString(section, key, value, path); }测试://创建⼀个test.ini⽂件并在A段落写⼊姓名(key)=wlj(value)IniWrite("A","姓名","wlj","f:/test.ini")IniWrite("B","姓名","WZQ","f:/test.ini")test.ini⽂件的格式:ini模版:[A]姓名=wlj[B]姓名=WZQ//读取test.ini⽂件中A 段落键=姓名的值IniReadValue("A","姓名","f:/test.ini")//读取test.ini⽂件中A 段落中所有值IniReadValue("A",null,"f:/test.ini")//删除test.ini⽂件中A 段落中所有键(没有键,也就没有值了)IniWrite("A",null,null,"f:/test.ini")//删除test.ini⽂件中所有段落IniWrite(null,null,null,"f:/test.ini")。
CFG、INI配置文件读写C程序
CFG、INI配置文件读写C程序/******************************************************************** * 文件名称: INIFileOP.C* 文件标识:* 其它说明: INI文件的操作* 当前版本: V1.0* 完成日期:********************************************************************* */#include#include#include/*#undef VOS_WINNT*/#define VOS_WINNT#ifdef VOS_WINNT#define INIFileTstmain main#endif#define SuccessRet 1;#define FailedRet 0;#defineMAX_CFG_BUF512#defineCFG_OK#define CFG_SECTION_NOT_FOUND-1#define CFG_KEY_NOT_FOUND -2#define CFG_ERR -10#define CFG_ERR_FILE -10#define CFG_ERR_OPEN_FILE -10#define CFG_ERR_CREATE_FILE -11#define CFG_ERR_READ_FILE -12#define CFG_ERR_WRITE_FILE -13#define CFG_ERR_FILE_FORMAT -14#define CFG_ERR_SYSTEM -20#define CFG_ERR_SYSTEM_CALL -20#define CFG_ERR_INTERNAL -21#define CFG_ERR_EXCEED_BUF_SIZE -22#define COPYF_OK 0#define COPYF_ERR_OPEN_FILE -10#define COPYF_ERR_CREATE_FILE -11#define COPYF_ERR_READ_FILE -12#define COPYF_ERR_WRITE_FILE -13#define TXTF_OK 0#define TXTF_ERR_OPEN_FILE -1#define TXTF_ERR_READ_FILE -2#define TXTF_ERR_WRITE_FILE -3#define TXTF_ERR_DELETE_FILE -4#define TXTF_ERR_NOT_FOUND -5char CFG_ssl = '[', CFG_ssr = ']';/* 项标志符Section Symbol --可根据特殊需要进行定义更改,如 { }等*/ char CFG_nis = ':'; /*name 与 index 之间的分隔符 */char CFG_nts = '#'; /*注释符*/int CFG_section_line_no, CFG_key_line_no, CFG_key_lines;static char * strtrimr(char * buf);static char * strtriml(char * buf);static int FileGetLine(FILE *fp, char *buffer, intmaxlen);static int SplitKeyValue(char *buf, char **key, char **val);extern int FileCopy(void *source_file, void *dest_file);extern int SplitSectionToNameIndex(char *section, char **name, char **index);extern int JoinNameIndexToSection(char **section, char *name, char *index);extern int ConfigGetKey(void *CFG_file, void *section, void *key, void *buf);extern int ConfigSetKey(void *CFG_file, void *section, void *key, void *buf);extern int ConfigGetSections(void *CFG_file, char *sections[]); extern int ConfigGetKeys(void *CFG_file, void *section, char *keys[]);extern void INIFileTstmain(void);/******************************************************************** *** 函数名称: strtrimr* 功能描述:去除字符串右边的空字符* 访问的表:无* 修改的表:无* 输入参数: char * buf 字符串指针* 输出参数:无* 返回值:字符串指针* 其它说明:无********************************************************************/ char * strtrimr(char * buf){intlen,i;char * tmp = NULL;len = strlen(buf);tmp = (char*)malloc(len);memset(tmp,0x00,len);for(i = 0;i <len;i++){if (buf[i] !=' ')break;}if (i<len) {strncpy(tmp,(buf+i),(len-i));}strncpy(buf,tmp,len);free(tmp);return buf;}/******************************************************************** *** 函数名称: strtriml* 功能描述:去除字符串左边的空字符* 访问的表:无* 修改的表:无* 输入参数: char * buf 字符串指针* 输出参数:无* 返回值:字符串指针* 其它说明:无********************************************************************* **/char * strtriml(char * buf){intlen,i;char * tmp=NULL;len = strlen(buf);tmp = (char*)malloc(len);memset(tmp,0x00,len);for(i = 0;i <len;i++){if (buf[len-i-1] !=' ')break;}if (i<len) {strncpy(tmp,buf,len-i);}strncpy(buf,tmp,len);free(tmp);return buf;}/******************************************************************** *** 函数名称: FileGetLine* 功能描述:从文件中读取一行* 访问的表:无* 修改的表:无* 输入参数: FILE *fp 文件句柄;intmaxlen 缓冲区最大长度* 输出参数: char *buffer 一行字符串* 返回值:实际读的长度* 其它说明:无********************************************************************* **/int FileGetLine(FILE *fp, char *buffer, intmaxlen){int i, j;char ch1;for(i = 0, j = 0; i<maxlen; j++){if(fread(&ch1, sizeof(char), 1, fp) != 1){if(feof(fp) != 0){if(j == 0) return -1; /* 文件结束 */else break;}if(ferror(fp) != 0) return -2; /* 读文件出错 */return -2;}else{if(ch1 == '\n' || ch1 == 0x00) break; /* 换行 */if(ch1 == '\f' || ch1 == 0x1A) /* '\f':换页符也算有效字符 */ {buffer[i++] = ch1;break;}if(ch1 != '\r') buffer[i++] = ch1; /* 忽略回车符 */ }}buffer[i] = '\0';return i;}/******************************************************************** *** 函数名称: FileCopy* 功能描述:文件拷贝* 访问的表:无* 修改的表:无* 输入参数: void *source_file 源文件void *dest_file 目标文件* 输出参数:无* 返回值: 0 -- OK,非0--失败* 其它说明:无********************************************************************* **/int FileCopy(void *source_file, void *dest_file){FILE *fp1, *fp2;char buf[1024+1];int ret;if((fp1 = fopen((char *)source_file, "r")) == NULL)return COPYF_ERR_OPEN_FILE;ret = COPYF_ERR_CREATE_FILE;if((fp2 = fopen((char *)dest_file, "w")) == NULL) gotocopy_end;while(1){ret = COPYF_ERR_READ_FILE;memset(buf, 0x00, 1024+1);if(fgets((char *)buf, 1024, fp1) == NULL){if(strlen(buf) == 0){if(ferror(fp1) != 0) gotocopy_end;break; /* 文件尾 */}}ret = COPYF_ERR_WRITE_FILE;if(fputs((char *)buf, fp2) == EOF) gotocopy_end;}ret = COPYF_OK;copy_end:if(fp2 != NULL) fclose(fp2);if(fp1 != NULL) fclose(fp1);return ret;}/******************************************************************** *** 函数名称: SplitSectionToNameIndex* 功能描述:分离section为name和index* [section]* / \* name:index* jack : 12* | | |* k1 k2 i* 访问的表:无* 修改的表:无* 输入参数: char *section* 输出参数: char **name, char **index* 返回值: 1 --- ok* 0 --- blank line* -1 --- no name, ":index"* -2 --- only name, no ':'* 其它说明:无********************************************************************/ int SplitSectionToNameIndex(char *section, char **name, char **index) {int i, k1, k2, n;if((n = strlen((char *)section)) < 1) return 0;for(i = 0; i< n; i++)if(section[i] != ' ' && section[i] != '\t') break;if(i>= n) return 0;if(section[i] == CFG_nis) return -1;k1 = i;for(i++; i< n; i++)if(section[i] == CFG_nis) break;if(i>= n) return -2;k2 = i;for(i++; i< n; i++)if(section[i] != ' ' && section[i] != '\t') break;section[k2] = '\0';*name = section + k1;*index = section + i;return 1;}/******************************************************************** *** 函数名称: JoinNameIndexToSection* 功能描述:合成name和indexsection为section* jack : 12* name:index* \ /* [section]* 访问的表:无* 修改的表:无* 输入参数: char *name, char *index* 输出参数: char **section* 返回值: 1 --- ok* 0 --- blank line* 其它说明:无********************************************************************/ int JoinNameIndexToSection(char **section, char *name, char *index)int n1,n2;if((n1 = strlen((char *)name)) < 1) return 0;if((n2 = strlen((char *)index)) < 1) return 0;strcat(*section,name);strcat(*section+n1,":");strcat(*section+n1+1,index);*(*section+n1+1+n2) = '\0';return 1;}/******************************************************************** *** 函数名称: SplitKeyValue* 功能描述:分离key和value* key=val* jack = liaoyuewang* | | |* k1 k2 i* 访问的表:无* 修改的表:无* 输入参数: char *buf* 输出参数: char **key;char **val* 返回值: 1 --- ok* 0 --- blank line* -1 --- no key, "= val"* -2 --- only key, no '='* 其它说明:无********************************************************************/ int SplitKeyValue(char *buf, char **key, char **val){int i, k1, k2, n;if((n = strlen((char *)buf)) < 1) return 0;for(i = 0; i< n; i++)if(buf[i] != ' ' &&buf[i] != '\t') break;if(i>= n) return 0;if(buf[i] == '=') return -1;k1 = i;for(i++; i< n; i++)if(buf[i] == '=') break;if(i>= n) return -2;k2 = i;for(i++; i< n; i++)if(buf[i] != ' ' &&buf[i] != '\t') break;buf[k2] = '\0';*key = buf + k1;*val = buf + i;return 1;}/******************************************************************** *** 函数名称: ConfigGetKey* 功能描述:获得key的值* 访问的表:无* 修改的表:无* 输入参数: void *CFG_file 文件;void *section 项值;void *key 键值* 输出参数: void *buf key的值* 返回值: 0 --- ok 非0 --- error* 其它说明:无********************************************************************/ int ConfigGetKey(void *CFG_file, void *section, void *key, void *buf) {FILE *fp;char buf1[MAX_CFG_BUF + 1], buf2[MAX_CFG_BUF + 1];char *key_ptr, *val_ptr;int line_no, n, ret;line_no = 0;CFG_section_line_no = 0;CFG_key_line_no = 0;CFG_key_lines = 0;if((fp = fopen((char *)CFG_file, "rb")) == NULL) returnCFG_ERR_OPEN_FILE;while(1) /* 搜找项section */{ret = CFG_ERR_READ_FILE;n = FileGetLine(fp, buf1, MAX_CFG_BUF);if(n < -1) gotor_cfg_end;ret = CFG_SECTION_NOT_FOUND;if(n < 0) gotor_cfg_end; /* 文件尾,未发现 */line_no++;n = strlen(strtriml(strtrimr(buf1)));if(n == 0 || buf1[0] == CFG_nts) continue; /* 空行或注释行 */ ret = CFG_ERR_FILE_FORMAT;if(n > 2 && ((buf1[0] == CFG_ssl&& buf1[n-1] != CFG_ssr))) gotor_cfg_end;if(buf1[0] == CFG_ssl){buf1[n-1] = 0x00;if(strcmp(buf1+1, section) == 0)break; /* 找到项section */}}CFG_section_line_no = line_no;while(1) /* 搜找key */{ret = CFG_ERR_READ_FILE;n = FileGetLine(fp, buf1, MAX_CFG_BUF);if(n < -1) gotor_cfg_end;ret = CFG_KEY_NOT_FOUND;if(n < 0) gotor_cfg_end; /* 文件尾,未发现key */line_no++;CFG_key_line_no = line_no;CFG_key_lines = 1;n = strlen(strtriml(strtrimr(buf1)));if(n == 0 || buf1[0] == CFG_nts) continue; /* 空行或注释行 */ ret = CFG_KEY_NOT_FOUND;if(buf1[0] == CFG_ssl) gotor_cfg_end;if(buf1[n-1] == '+') /* 遇+号表示下一行继续 */ {buf1[n-1] = 0x00;while(1){ret = CFG_ERR_READ_FILE;n = FileGetLine(fp, buf2, MAX_CFG_BUF);if(n < -1) gotor_cfg_end;if(n < 0) break; /* 文件结束 */line_no++;CFG_key_lines++;n = strlen(strtrimr(buf2));ret = CFG_ERR_EXCEED_BUF_SIZE;if(n > 0 && buf2[n-1] == '+') /* 遇+号表示下一行继续 */ {buf2[n-1] = 0x00;if(strlen(buf1) + strlen(buf2) > MAX_CFG_BUF)gotor_cfg_end;strcat(buf1, buf2);continue;}if(strlen(buf1) + strlen(buf2) > MAX_CFG_BUF)gotor_cfg_end;strcat(buf1, buf2);break;}}ret = CFG_ERR_FILE_FORMAT;if(SplitKeyValue(buf1, &key_ptr, &val_ptr) != 1)gotor_cfg_end;strtriml(strtrimr(key_ptr));if(strcmp(key_ptr, key) != 0)continue;/* 和key值不匹配 */strcpy(buf, val_ptr);break;}ret = CFG_OK;r_cfg_end:if(fp != NULL) fclose(fp);return ret;}/******************************************************************** *** 函数名称: ConfigSetKey* 功能描述:设置key的值* 访问的表:无* 修改的表:无* 输入参数: void *CFG_file 文件;void *section 项值;* void *key 键值;void *buf key的值* 输出参数:无* 返回值: 0 --- ok 非0 --- error* 其它说明:无********************************************************************/ int ConfigSetKey(void *CFG_file, void *section, void *key, void *buf) {FILE *fp1, *fp2;char buf1[MAX_CFG_BUF + 1];int line_no, line_no1, n, ret, ret2;char *tmpfname;ret = ConfigGetKey(CFG_file, section, key, buf1);if(ret <= CFG_ERR && ret != CFG_ERR_OPEN_FILE) return ret;if(ret == CFG_ERR_OPEN_FILE || ret == CFG_SECTION_NOT_FOUND) {if((fp1 = fopen((char *)CFG_file, "a")) == NULL)return CFG_ERR_CREATE_FILE;if(fprintf(fp1, "%c%s%c\n", CFG_ssl, section, CFG_ssr) == EOF) {fclose(fp1);return CFG_ERR_WRITE_FILE;}if(fprintf(fp1, "%s=%s\n", key, buf) == EOF){fclose(fp1);return CFG_ERR_WRITE_FILE;}fclose(fp1);return CFG_OK;}if((tmpfname = tmpnam(NULL)) == NULL)return CFG_ERR_CREATE_FILE;if((fp2 = fopen(tmpfname, "w")) == NULL)return CFG_ERR_CREATE_FILE;ret2 = CFG_ERR_OPEN_FILE;if((fp1 = fopen((char *)CFG_file, "rb")) == NULL) gotow_cfg_end;if(ret == CFG_KEY_NOT_FOUND)line_no1 = CFG_section_line_no;else /* ret = CFG_OK */line_no1 = CFG_key_line_no - 1;for(line_no = 0; line_no< line_no1; line_no++){ret2 = CFG_ERR_READ_FILE;n = FileGetLine(fp1, buf1, MAX_CFG_BUF);if(n < 0) gotow_cfg_end;ret2 = CFG_ERR_WRITE_FILE;if(fprintf(fp2, "%s\n", buf1) == EOF) gotow_cfg_end;}if(ret != CFG_KEY_NOT_FOUND)for( ; line_no< line_no1+CFG_key_lines; line_no++){ret2 = CFG_ERR_READ_FILE;n = FileGetLine(fp1, buf1, MAX_CFG_BUF);if(n < 0) gotow_cfg_end;}ret2 = CFG_ERR_WRITE_FILE;if(fprintf(fp2, "%s=%s\n", key, buf) == EOF) gotow_cfg_end;while(1){ret2 = CFG_ERR_READ_FILE;n = FileGetLine(fp1, buf1, MAX_CFG_BUF);if(n < -1) gotow_cfg_end;if(n < 0) break;ret2 = CFG_ERR_WRITE_FILE;if(fprintf(fp2, "%s\n", buf1) == EOF) gotow_cfg_end;}ret2 = CFG_OK;w_cfg_end:if(fp1 != NULL) fclose(fp1);if(fp2 != NULL) fclose(fp2);if(ret2 == CFG_OK){ret = FileCopy(tmpfname, CFG_file);if(ret != 0) return CFG_ERR_CREATE_FILE;}remove(tmpfname);return ret2;}/******************************************************************** *** 函数名称: ConfigGetSections* 功能描述:获得所有section* 访问的表:无* 修改的表:无* 输入参数: void *CFG_file 文件* 输出参数: char *sections[] 存放section名字* 返回值:返回section个数。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
LPTSTR lpszReturnBuffer, // 指向一个缓冲区,用来保存返回的所有节名
DWORD nSize, // 参数lpszReturnBuffer的大小
LPCTSTR lpKeyName, // 键名,读取该键的值
LPCTSTR lpDefault, // 若指定的键不存在,该值作为读取的默认值
LPTSTR lpReturnedString, // 一个指向缓冲区的指针,接收读取的字符串
LPCTSTR lpString // 键的值,是一个以0结束的字符串。若为NULL,则删除对应的键
)
2. 把信息写入自己定义的.ini文件
BOOL WritePrivateProfileString(
LPCTSTR lpAppName, // 同上
UINT GetProfileInt(
LPCTSTR lpAppName, // 同上
LPCTSTR lpKeyName, // 同上
INT nDefault // 若指定的键名不存在,该值作为读取的默认值
)
如使用以下语句写入了年龄信息:
)
由此可见,要删除某个节,只需要将WriteProfileString第二个参数设为NULL即可。而要删除某个键,则只需要将该函数的第三个参数设为 NULL即可。这是删除系统的win.ini中的节或键,类似的,要删除自己定义的ini文件中的节或键,也可做相同的操作。
如:
DWORD nSize // 指定lpReturnedString指向的缓冲区的大小
)
如:
CString str;
::GetProfileString("Test","id","Error",str.GetBuffer(20),20);
(2) 读取整数
for(i=0;i<2048;i++,j++)
{
if(chSectionNames[0]=='')
break; //如果第一个字符就是0,则说明ini中一个节也没有
if(chSectionNames[i]=='')
{
pSectionName=&chSectionNames[i-j]; //找到一个0,则说明从这个字符往前,减掉j个偏移量,
(2) 读取整数
UINT GetPrivateProfileInt(
LPCTSTR lpAppName, // 同上
LPCTSTR lpKeyName, // 同上
INT nDefault, // 若指定的键名不存在,该值作为读取的默认值
int j=0; //j用来保存下一个节名字符串的首地址相对于当前i的位置偏移量
int count=0; //统计节的个数
//CString name;
//char id[20];
::GetPrivateProfileSectionNames(chSectionNames,2048,".\ex1.ini");
[转载]VC操作INI文件(2010-04-11 21:30:26)转载▼标签: 转载 分类: vc
好东西哇 谢谢
原文地址:VC操作INI文件作者:忘忧草
VC中用函数读写ini文件的方法
ini文件(即Initialization file),这种类型的文件中通常存放的是一个程序的初始化信息。ini文件由若干个节(Section)组成,每个Section由若干键(Key)组成,每个Key可以赋相应的值。读写ini文件实际上就是读写某个的Section中相应的Key的值,而这只要借助几个函数即可完成。
需要注意的是,C系列的语言中,转义字符'\'表示反斜线''。另外,当使用相对路径时,\前的.号不能丢掉了。
二、从ini文件中读取数据的函数
1、从系统的win.ini文件中读取信息
(1) 读取字符串
DWORD GetProfileString(
LPCTSTR lpAppName, // 节名
LPTSTR lpReturnedString, // 同1(1)
DWORD nSize, // 同1(1)
LPCTSTR lpFileName // 读取信息的文件名。若该ini文件与程序在同一个目录下,也可使用相
}
}
}
return count;
}
补充四点:
则可用以下语句读取age键的值:
int age;
age=::GetPrivateProfileInt("Test","age",0,".\ex1.ini");
三、删除键值或节
回顾一下WriteProfileString函数的说明
BOOL WriteProfileString(
LPCTSTR lpAppName, // 节的名字,是一个以0结束的字符串
LPCTSTR lpKeyName, // 键的名字,是一个以0结束的字符串。若为NULL,则删除整个节
LPCTSTR lpString // 键的值,是一个以0结束的字符串。若为NULL,则删除对应的键
LPCTSTR lpKeyName, // 同上
LPCTSTR lpString, // 同上
LPCTSTR lpFileName // 要写入的文件的文件名。若该ini文件与程序在同一个目录下,也可使用相对
//路径,否则需要给出绝度路径。
(1) 读取字符串
DWORD GetPrivateProfileString(
LPCTSTR lpAppName, // 同1(1)
LPCTSTR lpKeyName, // 同1(1)
LPCTSTR lpDefault, // 同1(1)
LPCTSTR lpFileName // 文件名,若该ini文件与程序在同一个目录下,
//也可使用相对路径,否则需要给出绝度路径
)
下面的是用来统计一个ini文件中共有多少个节的函数,当然,如果需要同时找到每个节中的各个键及其值,根据找到节名就可以很容易的得到了。
::WritePrivateProfileString("Test","id",NULL,".\ex1.ini"); //删除ex1.ini中的id键
四、如何判断一个ini文件中有多少个节
要判断一个ini文件中有多少个节,最简单的办法就是将所有的节名都找出来,然后统计节名的个数。而要将所有的节名找出来,使用GetPrivateProfileSectionNames函数就可以了,其原型如下:
//就是一个节名Βιβλιοθήκη 首地址 j=-1; //找到一个节名后,j的值要还原,以统计下一个节名地址的偏移量
//赋成-1是因为节名字符串的最后一个字符0是终止符,不能作为节名
//的一部分
::WriteProfileString("Test",NULL,NULL); //删除win.ini中的Test节
::WriteProfileString("Test","id",NULL); //删除win.ini中的id键
::WritePrivateProfileString("Test",NULL,NULL,".\ex1.ini"); //删除ex1.ini中的Test节
LPCTSTR lpFileName // 同上
)
如使用以下语句写入了年龄信息:
::WritePrivateProfileString("Test","age","25",".\ex1.ini");
//在ex1.ini中创建一个Test节,并在该节中创建一个键age,其值为25
)
如:
::WriteProfileString("Test","id","xym");
//在win.ini中创建一个Test节,并在该节中创建一个键id,其值为xym
::WritePrivateProfileString("Test","id","xym","d:\vc\Ex1\ex1.ini");
::WriteProfileString("Test","age","25");
//在win.ini中创建一个Test节,并在该节中创建一个键age,其值为25
则可用以下语句读取age键的值:
int age;
age=::GetProfileInt("Test","age",0);
2、从自己的ini文件中读取信息
//在获取节名的时候可以获取该节中键的值,前提是我们知道该节中有哪些键。
AfxMessageBox(pSectionName); //把找到的显示出来
if(chSectionNames[i+1]==0)
{
break; //当两个相邻的字符都是0时,则所有的节名都已找到,循环终止
//对路径,否则需要给出绝度路径。
)
如:
CString str;
::GetPrivateProfileString("Test","id","Error",str.GetBuffer(20),20,".\ex1.ini");