#include<iostream>
#include <windows.h>
using
namespace
std;
struct
Data
{
int
n;
char
c[260];
};
int
main()
{
Data d1,d2;
d1.n=10;
strcpy
(d1.c,
"hello"
);
WritePrivateProfileStruct(
"MI"
,
"DATA"
, &d1,
sizeof
(Data),
"f:\\a.ini"
);
//mark
GetPrivateProfileStruct(
"MI"
,
"DATA"
, &d2,
sizeof
(Data),
"f:\\a.ini"
);
//mark
cout<<d2.n<<endl<<d2.c<<endl;
return
0;
INI文件简介
在我们写程序时,总有一些配置信息需要保存下来,以便在下一次启动程序完成初始化,这实际上是一种类持久化。将一些信息写入INI文件(initialization file)中,可完成简单的持久化支持。
Windows提供了API接口用于操作INI文件,其支持的INI文件格式一般如下:
===============================
[Section1]
Key11=value11
Key12=value12
[Section2]
Key21=value21
Key22=value22
...
[SectionN]
KeyN1=valueN1
KeyN2=valueN2
===============================
一般一个INI文件可有N个节,每节可有n个键名及值对应,每个键名及其值以等式形式占一行。
一般键的名称可任取,不过建议用有意义的字符及词构成。值一般可为整数和字符串,其它类型要进行转换。
常见的系统配置文件:
C:/boot.ini
C:/WINDOWS/win.ini
C:/WINDOWS/system.ini
C:/WINDOWS/desktop.ini
C:/WINDOWS/Resources/Themes/Windows Classic.theme
注意,字符串存贮在INI文件中时没有引号;key和value之间的等号前后不容空格;注释以分号“;”开头。
VC中操作INI文件的API
(1)操作系统配置文件Win.ini的函数:
函数名 |
功能 |
GetProfileSection |
读取win.ini中指定节lpAppName中所有键名及其值。lpReturnedString字符串形式如下: Key1=Value1/0Key2=Value2/0…KeyN=ValueN/0/0 |
GetProfileString |
读取win.ini中指定节lpAppName中键名为lpKeyName对应变量的字符串值。 |
GetProfileInt |
读取win.ini中指定节lpAppName中键名为lpKeyName对应变量的整数值。 |
|
|
WriteProfileSection |
写(替换)win.ini中指定节lpAppName中的键值。 lpString字符串形式同GetProfileSection中的lpReturnedString。 |
WriteProfileString |
写(替换)win.ini中指定节lpAppName中键名为lpKeyName对应变量的字符串值。 |
(2)操作用户自定义配置文件(PrivateProfile.ini)的函数:
函数名 |
功能 |
GetPrivateProfileSectionNames |
读取lpFileName指定的配置文件中所有的节名。lpszReturnBuffer字符串形式如下: Section1/0Section2/0…SectionN/0/0 |
GetPrivateProfileSection |
同GetProfileSection。 |
GetPrivateProfileString |
同GetProfileString。 |
GetPrivateProfileInt |
同GetProfileInt |
GetPrivateProfileStruct |
须同WritePrivateProfileStruct配套使用。 |
|
|
WritePrivateProfileSection |
同WriteProfileSection |
WritePrivateProfileString |
同WriteProfileString |
WritePrivateProfileStruct |
不常用。 |
注意:
(1)使用得最频繁的是 GetPrivateProfileString 和 WritePrivateProfileString,没有WriteProfileInt/WritePrivateProfileInt函数。
(2)Get系列读取节键值,如果文件路径有误或节键名不对则返回设定的默认值。
(3)访存自定义配置文件时,文件路径lpFileName必须完整,文件名前面的各级目录必须存在。如果lpFileName文件路径不存在,则函数返回FALSE,GetLastError() = ERROR_PATH_NOT_FOUND。如果路径正确,但是文件不存在,则该函数将先创建该文件。如果路径及文件存在,则在现有ini文件基础上进行读写。
如果 lpFileName 只指定文件名而没有路径的话,调用API将会去 Windows 的安装目录去查找而不会在当前目录查找。
(4)要对调用API的模块(exe)所在目录下进行配置文件操作,可使用形如“.//config.ini”的相对路径,注意转义符。
(5)调用WritePrivateProfileSection,若参数三 lpString为NULL,则可将对应section的全部内容清空;调用WritePrivateProfileString,若参数三 lpString为NULL,则可将对应key删除。
跨平台配置文件
INI文件本质是对文件和字符串的处理,因此在跨平台项目中的配置文件可以基于<stdio.h>中的标C文件FILE,然后实现像类似以上对节([Section])、键(Key)和值(Value)的字符串读写功能。
鉴于XML的树形描述层次结构性清晰,现在很多软件都大面积使用XML文件进行配置,如QQ的全局配置文件C:/Program Files/Tencent/QQ/gf-config.xml。java程序的配置文件基本都使用XML格式,C++中并没有操作XML文件的标准库。
在C/C++程序中要使用XML做为配置文件,涉及到XML的解析。Windows平台可使用MsXml对XML进行解析,参考《MsXml创建和解析XML示例》,跨平台可以考虑自己实现,或使用C++ BOOST正则表达式,或选择Free C or C++ XML Parser Libraries,如XmlParser、TinyXML、CMarkup、libxml等。
CIniFile类
以下提供对Windows操作INI文件的API的简单封装类CIniFile。
参考:
《INI操作类》
《INI文件查看器》
文章浏览阅读386次。我常常遇到这样的情况:服务器上已经有可悲的是,这样的转换几乎是不可能的,而且我认为这在将来也不会成为可能。很多原因导致该功能在最初不会是一个好想法,而且它会变得越来越不必要。下面就是原因。一开始,磁盘格式的就地转换本身就很危险。当你在给定系统唯一可用的副本上工作时,这是颇具风险的行为。你相信该程序可以立刻操控整个卷,不会有多大失误。如果转换期间某部分出错了,该数据的唯一副本就破坏了。此外,如果该数..._文件系统 ext3怎么把数据导到window
文章浏览阅读3.5k次。为什么80%的码农都做不了架构师?>>> ..._go 取反操作
文章浏览阅读132次。2019年2月20日,北京大学“人工智能前沿与产业趋势”正式开课。本学期的课程邀请到了商汤科技副总裁沈徽、驭势科技CEO吴甘沙、微软亚洲研究院副院长周明、360人工智能研究院院长颜水成、YC中国创始人及CEO、百度集团副董事长陆奇等14位来自产业界的大咖进行授课,我们作为独家合作媒体将全程跟进并对北大这14场公开课进行整理,敬请关注!北大人工智能创新中心主任雷鸣作为课程的发起人与主持人率先开讲。作...
文章浏览阅读4.4k次,点赞2次,收藏11次。题目:运算精度设置为单精度,用Matlab编程实现解下列方程组,分别使用顺序Gauss消去法和列主元Gauss消去法给出计算结果,并回答下列问题:计算结果和期望结果是否一致,为什么 给出例子分析计算结果的计算程序 答:主函数程序如下:clc;clear all;digits(8)A=[vpa(10^(-9)) 1;1 1]b=[1;2];x=GaussNaiv..._分别用顺序高斯消去法和列祖元高斯消去法求解下列方程组验证计算结果并分析误
文章浏览阅读1.8k次。1.首先到官网下载最新py源码包 地址:https://www.python.org2.将python3.7.4.tgz上传至目标服务器。3. 解压 并./configure --prefix=/usr/local/python3.7.4 执行脚本对该目录进行配置4. make && make install插曲:1.zipimport.ZipImportError..._离线安装linux环境的python3.7.4
文章浏览阅读5k次。matlab 读取excel时间数据并绘图没看懂你的格式是什么意思,不过我一般读取excel都用xlsread函数,你也可以试一试[a,b,c]=xlsresd('data.xls');%r如果是office2007及以上。那就是data.xlsxa b c 是读取不同的数据类型在matlab上如何导入excel表格然后画图工具:MATLAB、office excel步骤将待导入的矩阵结构的数据录..._matlab批量读取excel表格数据并处理画图
文章浏览阅读5.1k次,点赞3次,收藏6次。最近需要将几组png序列转成gif,之前有用过“Ulead GIF Animator” 和 “Photoshop”,这两款软件应该能满足需求!“Ulead GIF Animator”只有windows版,这些年mac是主力机且一直刻意减少使用PS,通过命令行应该有法子可以生成gif?首先想到的是ffmpeg,虽然ffmpeg主要是视频处理,最近发现可以用它来做一些图片处理,例如 png转jpg、gif转png序列、裁切图片等。一般用ffmpeg基本都是截取视频生成gif,gif没有透明度 ffmpeg _png序列转透明底gif
文章浏览阅读4.7k次。特此记录:连续使用两个cmd命令中间用 &&相连 cmd /c是运行完后关闭窗口 cmd /k是运行完后不关闭,注意!!!这个String里面的内容最好自己手敲,复制进去可能运行不了。 String cmd="cmd /c cd /d d:\\nginx_rtmp\\nginx && .\\nginx.exe -c .\\conf\\nginx-win-rtmp.conf"; Runtime run = Runtime.getRuntime(); _java在指定目录调用cmd命令
文章浏览阅读1k次。本期的每周一库带来的是imgui-rs,是一个Rust下的Dear ImGui binding,从名字不难看出,这是一个GUI框架的库下面我们主要参考i..._rust imgui
文章浏览阅读52次。为什么80%的码农都做不了架构师?>>> ..._android studio怎么用轮播图组合其他控件
文章浏览阅读544次。根据侯捷老师的视频:https://www.bilibili.com/video/BV1Kb411B7N8这篇文章归纳内存管理的面试题和一些知识点梳理正在更新中首先为什么想要内存管理不知道有没有人好奇delete[]或者delete的时候为什么系统会自动这个变量 占了多少字节。答案是因为cookies,每次内存获取的时候,系统都会额外分配4个字节的cookies用来标注这次分配内存会占用多少内存空间。如图:分配了长度为10的int数组,他在调用函数sizeof()的时候是占用了40字节,可是实_delete[]为什么逆序
文章浏览阅读8.2k次。跟着方法做,重启ide后报错:If you already have a 64-bit JDK installed ,defined a JAVA_HOME variable in Computer>System Properties>System Settings>Environment Variables Failed to create JVM .JVM Path:问题:我是因为根据文档中3.将 - javaagent: C: \ jetbrains-agent.jar _if you already have a 64-bit jdk