C++读取INI文件

Windows操作系统专门为此提供了6个API函数来对配置设置文件进行读、写:

GetPrivateProfileInt() 从私有初始化文件获取整型数值
GetPrivateProfileString() 从私有初始化文件获取字符串型值
GetProfileInt 从win.ini 获取整数值
GetProfileString 从win.ini 获取字符串值
WritePrivateProfileString 写字符串到私有初始化文件
WriteProfileString 写字符串到win.ini

我们可以把视图类的:OnInitialUpdate() 函数作为程序启动时读取配置文件的入口,配置文件的存储格式如下:

[SECTION 1]
XPos=300
YPos=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中有定义,为128
int len=GetModuleFileName(NULL,
exeFullPath, //应用程序的全路径存放地址
MAX_PATH);
CString path="\test.ini"; //配置文件名
::strcpy(exeFullPath+len-13,path); //组合出配置文件的全路径

值得注意的是这里的13是项目名的大小,但是不同项目可能名字不一样,定义这样的长度过于机械化

1char*p =NULL;
2    charexeFullPath[128];
3    intlen=GetModuleFileName(NULL,
4        exeFullPath,                128);
5    p=strrchr(exeFullPath, '\\');   
6    *p='\0';

这样,通过strrchr函数屏蔽掉最后出现的'\'就能够把项目名也屏蔽掉了,根据不同的情况当然也有不同的做法。


写配置文件也基本类似,只是需要把数值类型的变量格式化成字符串再行存储:

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文件中读入程序中的变量.

1.所用的WINAPI函数原型为:

DWORD GetPrivateProfileString(
LPCTSTR lpAppName,
LPCTSTR lpKeyName,
LPCTSTR lpDefault,
LPTSTR lpReturnedString,
DWORD nSize,
LPCTSTR lpFileName
);

其中各参数的意义:

前二个参数与 WritePrivateProfileString中的意义一样.

lpDefault : 如果INI文件中没有前两个参数指定的字段名或键名,则将此值赋给变量.

lpReturnedString : 接收INI文件中的值的CString对象,即目的缓存器.

nSize : 目的缓存器的大小.

lpFileName : 是完整的INI文件名.

2.具体使用方法:现要将上一步中写入的学生的信息读入程序中.

CString strStudName;
int nStudAge;
GetPrivateProfileString("StudentInfo","Name","默认姓名",strStudName.GetBuffer(MAX_PATH),MAX_PATH,"c:\stud\student.ini");

执行后 strStudName 的值为:"张三",若前两个参数有误,其值为:"默认姓名".

3.读入整型值要用另一个WINAPI函数:

UINT GetPrivateProfileInt(
LPCTSTR lpAppName,
LPCTSTR lpKeyName,
INT nDefault,
LPCTSTR lpFileName
);

这里的参数意义与上相同.使用方法如下:
nStudAge=GetPrivateProfileInt("StudentInfo","Age",10,"c:\stud\student.ini");




贴上自己WIN32测试并通过的一段例子(部分代码,主要功能是如何配置相对路径,后续操作,前面已经有了)

1char*p =NULL;
2    charexeFullPath[128];
3    intlen=GetModuleFileName(NULL,
4        exeFullPath,                    //应用程序的全路径存放地址
5128);
6    p=strrchr(exeFullPath, '\\');        //屏蔽掉项目名称
7*p='\0';
8    p=strrchr(exeFullPath, '\\');        //屏蔽掉DEBUG(实际开发中这个可能不需要)
9*p='\0';
10    len =strlen(exeFullPath);
11    stringpath="\\system.ini";            //配置文件名
12::strcpy(exeFullPath+len,path.c_str()); //组合出配置文件的全路径
13
14
15    charipstr[20];                        //存储IP地址
16GetPrivateProfileString("Server","ServerIP",NULL,ipstr,20,exeFullPath);
17    intport;
18    port =GetPrivateProfileInt("Server","Port",0,exeFullPath);



下面这段是公司里工作时候写的,做个记录

1//将内容以','分离
2stringstrFream =szFream;
3    vector<string>strVec;
4    charcTrim =',';
5    std::string::size_type pos1, pos2;
6    pos2 =0;
7    while(pos2 !=std::string::npos)
8    {
 9        pos1 = strFream.find_first_not_of(cTrim, pos2);
10        if (pos1 == std::string::npos)
11            break;
12        pos2 = strFream.find_first_of(cTrim, pos1 + 1);
13        if (pos2 == std::string::npos)
14        {
15            if (pos1 != strFream.size())
16                strVec.push_back(strFream.substr(pos1)); 
17            break;
18        }

19        strVec.push_back(strFream.substr(pos1, pos2 - pos1));
20    }

21    for(inti =0; i <strVec.size();++i)
22    {
23        int nTemp = atoi(strVec[i].c_str());
24        if(nTemp < m_nFrameNum)
25            m_vecFrame.push_back(nTemp);
26        else continue;
27    }

转载于:https://www.cnblogs.com/qq78292959/archive/2012/06/10/2544389.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/494963.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

专栏 | 李航教授展望自然语言对话领域:现状与未来

来源&#xff1a;机器之心摘要&#xff1a;原华为诺亚方舟实验室主任、现已加入字节跳动 AI Lab的李航教授近日发表博客&#xff0c;对自然语言对话领域的现状和最新进展进行总结&#xff0c;并展望了未来的走向。1. 引言语音助手、智能客服、智能音箱、聊天机器人&#xff0c;…

浅析智能指针

为什么要有智能指针&#xff1f; 1.什么是智能指针&#xff1f; 智能指针是一个类&#xff0c;这个类的构造函数中传入一个普通指针&#xff0c;析构函数中释放传入的指针。智能指针的类都是栈上的对象&#xff0c;所以当函数&#xff08;或程序&#xff09;结束时会自动被释放…

论强化学习的根本缺陷

来源&#xff1a;AI 科技评论摘要&#xff1a;本文来自斯坦福大学博士生 Andrey Kurenkov 在 The Gradient 上发表的文章。在本文中&#xff0c;我们将讨论人工智能的一个核心领域——强化学习——的局限性。在这个过程中&#xff0c;起初我们将通过一个有趣的例子提出我们要讨…

最后期限已至,高通收购恩智浦全剧终!中国一刀切断高通物联网全局梦!

来源&#xff1a;物联网智库摘要&#xff1a;没有一种商业模式可以永享特权。物联网时代&#xff0c;当专利和芯片两大支柱业务均受到剧烈冲击和威胁之下&#xff0c;如何创新以自救&#xff0c;正是考验高通全面战略能力的关键时刻&#xff0c;恩智浦是当前高通给出的最好答案…

斯坦福证明神经网络能直接在光学芯片上训练

来源&#xff1a;全球人工智能摘要&#xff1a;据报道&#xff0c;美国斯坦福大学的研究人员已经证明&#xff0c;可以直接在光学芯片上训练人工神经网络。据报道&#xff0c;美国斯坦福大学的研究人员已经证明&#xff0c;可以直接在光学芯片上训练人工神经网络。这一重大突破…

用Keil-MDK开发TQ2440裸机程序入门教程——LED流水灯实现

觉得此编文章很详实&#xff0c;故转载之&#xff0c;来自http://www.amobbs.com/thread-5281512-1-1.html 开发板也差不多买了半年了, 以前照着教程用的是软件是ADS,在win7下老是崩溃, 后来才知道ADS早就不提供支持了, ADS的公司怎样怎样了...(此处省略300..) 然后我就捣鼓着怎…

关于量子计算,你应该知道的七个事实

来源&#xff1a;资本实验室摘要&#xff1a;在很多人眼中&#xff0c;量子计算机被认为能够完成经典计算机所不能完成的任务。聚焦前沿科技创新与传统产业升级在很多人眼中&#xff0c;量子计算机被认为能够完成经典计算机所不能完成的任务。事实上&#xff0c;如果量子计算机…

机器学习帮助人类找到最硬的过渡金属氮化物

来源&#xff1a;中国科学杂志社摘要&#xff1a;南京大学物理学院孙建教授和王慧田教授领导的研究团队发展了机器学习加速晶体结构搜索的方法&#xff0c;并用其预测了一种超硬的钨氮化合物。机器学习算法在很多领域取得了令人瞩目的进步&#xff0c;从而广受人们关注&#xf…

WEB攻防实战篇,思维导图

转载于:https://www.cnblogs.com/sin4/archive/2012/06/16/2551603.html

二维数组按行和按列遍历的效率

按行遍历的效率大概是是按列遍历的0.5倍 在c语言中&#xff0c;数组在内存中是按行存储的&#xff0c;按行遍历时可以由指向数组第一个数的指针一直向后遍历&#xff0c;由于二维数组的内存地址是连续的&#xff0c;当前行的尾与下一行的头相邻&#xff0c;所以可以直接到下一行…

解读《自适应机器人交互白皮书》:机器人交互需要突破性技术

来源&#xff1a;机器人创新生态摘要&#xff1a;7月11日雷克大会&#xff0c;英特尔中国研究院机器人交互实验室研发总监任海兵在演讲时&#xff0c;就白皮书中的内容进行了重点解读。个人服务机器人在近年来随着人工智能的快速发展开始得到不少关注。个人服务机器人是否真正能…

最长升序子串1231

题目与解析 给定n个数字&#xff0c;在这n个数字中找出最长上升子序列。 那么什么是上升子序列呢&#xff1f; 上升子序列就是在一个数列中递增的部分&#xff0c;不一定是连续的&#xff0c;比如说 图中的24678和24679都是数列24635798的上升子序列 解题思路 就按图上2 4 …

科学革命与科学教科书

来源&#xff1a;《出版科学》2018年第4期摘要&#xff1a;借助科学哲学的反思&#xff0c;加上科学家和出版人的创新实践&#xff0c;一定能够出现既能促进常规科学研究、又能为科学革命做出某些准备的新型科学教科书。《科学革命的结构》托马斯 • 库恩著&#xff0c;金吾伦、…

物联网可应用于十大行业嘛?

来源&#xff1a;亿欧智库摘要&#xff1a;近些年来&#xff0c;全球经济增长乏力&#xff0c;物联网已变成了各国经济发展的新动力。基于此&#xff0c;亿欧智库近日将发布一份新的报告《2018物联网行业应用研究报告》&#xff0c;报告总结出了物联网的十大应用行业&#xff0…

浅析死锁

什么是死锁&#xff1f; 死锁就是两个或多个进程在执行的过程中&#xff0c;由于竞争资源或者由于彼此通信而造成的一种阻塞现象&#xff0c;当进程处于这种状态时&#xff0c;如果没有外力的作用&#xff0c;这些进程都无法继续向前进行。这是操作系统层面的一个错误&#xff…

2018年全球AI突破性技术TOP10

来源&#xff1a;艾瑞网摘要&#xff1a;聪明的科技公司都不再单一的专注于自己的传统业务&#xff0c;而是着眼于未来&#xff0c;不断创新技术&#xff0c;跨界融合打造一个整合的生态系统。人工智能是个高科技、宽领域、多维度、跨学科的集大成者&#xff0c;从立足大数据、…

全球11个行业、71家知名企业的创新Lab与布局

来源&#xff1a;CBInsights新技术的革新引发了商业世界重构的浪潮&#xff0c;在这一波由人工智能引领的创新潮流里唯有拥抱变化才能不为时代淘汰&#xff0c;顺应趋势取得更大的发展。新技术的革新引发了商业世界重构的浪潮&#xff0c;在这一波由人工智能引领的创新潮流里唯…

组队竞赛

题目解析&#xff1a; 队伍的水平值等于该队伍队员中第二高水平值&#xff0c;为了所有队伍的水平值总和最大的解法&#xff0c;也就是说每个队伍的第二个值是尽可能大的值。所以实际值把最大值放到最右边&#xff0c;最小是放到最左边。 解题思路&#xff1a; 本题的主要思路是…

【SD】差异值 生成 同一人物 制作 表情包 【1】

说明&#xff1a;只对AI生成的人物&#xff0c;效果稳定。 Reference差异值 生成表情 首先生成一张图片。 测试命令&#xff1a;1 man,chibi,full body, 模型&#xff1a;envyclarityxl02_v10.safetensors [f6c13197db] 种子&#xff1a;2704867166 》》测试命令&#xff1a…

MySQL索引原理、失效情况

声明&#xff1a;本文是小编在学习过程中&#xff0c;东拼西凑整理&#xff0c;如有雷同&#xff0c;纯属借鉴。 Mysql5.7的版本, InnoDB引擎 目录 1 mysql索引知识 1.1 BTree索引 1.2 主键索引和普通索引的区别 1.3 唯一索引vs普通索引 2 mysql索引优化 2.1 查看索引使…