WriteProfileString 函数 , WritePrivateProfileString 函数, WritePrivateProfileStruct 函数-程序员宅基地

技术标签: c  VC++  ini  windows  


WriteProfileString 函数:
背景:
   调用了WriteProfileString, 却不知道该配置信息到底是注册表中,还是在INI文件中. 经过在网上查询, 在windows的目录下找到与程序名同名的INI文件.
原因:
 1/调试跟踪到CWinApp::WriteProfileString中间,发现了这个函数:
return ::WritePrivateProfileString(lpszSection, lpszEntry, lpszValue,m_pszProfileName);
然后根据m_pszProfileName的名字as.ini(因为我的应用程序名字为as.exe)查找,最后在C:/WINDOWS下查找到了as.ini的文件,打开正好;
  2/ 事实上WriteProfileString可以往注册表写也可往INI文件写,关键是SetRegistryKey,如果执行了   SetRegistryKey,那么就会写往注册表,如果没有,就会写往INI文件,请看   MSDN   说明:  
  3/如果你要写文件,用WritePrivateProfileString吧,不要用那个WriteProfileString.

WritePrivateProfileString 函数:
GetPrivateProfileString函数对应;


WritePrivateProfileStruct 函数
#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,如XmlParserTinyXMLCMarkuplibxml等。

 

CIniFile类

    以下提供对Windows操作INI文件的API的简单封装类CIniFile。

  1. // IniFile.h  
  2. #ifndef __INIFILE_H__  
  3. #define __INIFILE_H__  
  4.   
  5. class CIniFile  
  6. {  
  7. public:  
  8.     CIniFile();  
  9.     CIniFile(LPCTSTR szFileName);  
  10.     virtual ~CIniFile();  
  11.       
  12. public:  
  13.     // Attributes     
  14.     void SetFileName(LPCTSTR szFileName);  
  15.       
  16. public:  
  17.     // Operations  
  18.     BOOL SetProfileInt(LPCTSTR lpszSectionName, LPCTSTR lpszKeyName, int nKeyValue);  
  19.     BOOL SetProfileString(LPCTSTR lpszSectionName, LPCTSTR lpszKeyName, LPCTSTR lpszKeyValue);  
  20.   
  21.     DWORD GetProfileSectionNames(CStringArray& strArray); // 返回section数量  
  22.   
  23.     int GetProfileInt(LPCTSTR lpszSectionName, LPCTSTR lpszKeyName);  
  24.     DWORD GetProfileString(LPCTSTR lpszSectionName, LPCTSTR lpszKeyName, CString& szKeyValue);  
  25.   
  26.     BOOL DeleteSection(LPCTSTR lpszSectionName);  
  27.     BOOL DeleteKey(LPCTSTR lpszSectionName, LPCTSTR lpszKeyName);  
  28.       
  29. private:  
  30.     CString  m_szFileName; // .//Config.ini, 如果该文件不存在,则exe第一次试图Write时将创建该文件  
  31.   
  32.     UINT m_unMaxSection; // 最多支持的section数(256)  
  33.     UINT m_unSectionNameMaxSize; // section名称长度,这里设为32(Null-terminated)  
  34.   
  35.     void Init();  
  36. };  
  37.   
  38. #endif  
  39.   
  40. // IniFile.cpp  
  41. #include "IniFile.h"  
  42.   
  43. void CIniFile::Init()  
  44. {  
  45.     m_unMaxSection = 512;  
  46.     m_unSectionNameMaxSize = 33; // 32位UID串  
  47. }  
  48.   
  49. CIniFile::CIniFile()  
  50. {  
  51.     Init();  
  52. }  
  53.   
  54. CIniFile::CIniFile(LPCTSTR szFileName)  
  55. {  
  56.     // (1) 绝对路径,需检验路径是否存在  
  57.     // (2) 以"./"开头,则需检验后续路径是否存在  
  58.     // (3) 以"../"开头,则涉及相对路径的解析  
  59.       
  60.     Init();  
  61.   
  62.     // 相对路径  
  63.     m_szFileName.Format(".//%s", szFileName);  
  64. }  
  65.   
  66. CIniFile::~CIniFile()    
  67. {  
  68.       
  69. }  
  70.   
  71. void CIniFile::SetFileName(LPCTSTR szFileName)  
  72. {  
  73.     m_szFileName.Format(".//%s", szFileName);  
  74. }  
  75.   
  76. DWORD CIniFile::GetProfileSectionNames(CStringArray &strArray)  
  77. {  
  78.     int nAllSectionNamesMaxSize = m_unMaxSection*m_unSectionNameMaxSize+1;  
  79.     char *pszSectionNames = new char[nAllSectionNamesMaxSize];  
  80.     DWORD dwCopied = 0;  
  81.     dwCopied = ::GetPrivateProfileSectionNames(pszSectionNames, nAllSectionNamesMaxSize, m_szFileName);  
  82.       
  83.     strArray.RemoveAll();  
  84.   
  85.     char *pSection = pszSectionNames;  
  86.     do   
  87.     {  
  88.         CString szSection(pSection);  
  89.         if (szSection.GetLength() < 1)  
  90.         {  
  91.             delete[] pszSectionNames;  
  92.             return dwCopied;  
  93.         }  
  94.         strArray.Add(szSection);  
  95.   
  96.         pSection = pSection + szSection.GetLength() + 1; // next section name  
  97.     } while (pSection && pSection<pszSectionNames+nAllSectionNamesMaxSize);  
  98.   
  99.     delete[] pszSectionNames;  
  100.     return dwCopied;  
  101. }  
  102.   
  103. DWORD CIniFile::GetProfileString(LPCTSTR lpszSectionName, LPCTSTR lpszKeyName, CString& szKeyValue)  
  104. {  
  105.     DWORD dwCopied = 0;  
  106.     dwCopied = ::GetPrivateProfileString(lpszSectionName, lpszKeyName, "",   
  107.         szKeyValue.GetBuffer(MAX_PATH), MAX_PATH, m_szFileName);  
  108.     szKeyValue.ReleaseBuffer();  
  109.   
  110.     return dwCopied;  
  111. }  
  112.   
  113. int CIniFile::GetProfileInt(LPCTSTR lpszSectionName, LPCTSTR lpszKeyName)  
  114. {  
  115.     int nKeyValue = ::GetPrivateProfileInt(lpszSectionName, lpszKeyName, 0, m_szFileName);  
  116.       
  117.     return nKeyValue;  
  118. }  
  119.   
  120. BOOL CIniFile::SetProfileString(LPCTSTR lpszSectionName, LPCTSTR lpszKeyName, LPCTSTR lpszKeyValue)  
  121. {  
  122.     return ::WritePrivateProfileString(lpszSectionName, lpszKeyName, lpszKeyValue, m_szFileName);  
  123. }  
  124.   
  125. BOOL CIniFile::SetProfileInt(LPCTSTR lpszSectionName, LPCTSTR lpszKeyName, int nKeyValue)  
  126. {  
  127.     CString szKeyValue;  
  128.     szKeyValue.Format("%d", nKeyValue);  
  129.   
  130.     return ::WritePrivateProfileString(lpszSectionName, lpszKeyName, szKeyValue, m_szFileName);  
  131. }  
  132.   
  133. BOOL CIniFile::DeleteSection(LPCTSTR lpszSectionName)  
  134. {  
  135.     return ::WritePrivateProfileSection(lpszSectionName, NULL, m_szFileName);  
  136. }  
  137.   
  138. BOOL CIniFile::DeleteKey(LPCTSTR lpszSectionName, LPCTSTR lpszKeyName)  
  139. {  
  140.     return ::WritePrivateProfileString(lpszSectionName, lpszKeyName, NULL, m_szFileName);  
  141. }  

参考:

在VC++中读写INI文件

VC INI文件读写

用VC++操作INI文件

INI操作类

INI文件查看器

C++中的XML配置文件编程经验



版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/chinabinlang/article/details/6424885

智能推荐

linux 迁移文件windows,如何完成Linux文件系统与Windows文件系统间的迁移?-程序员宅基地

文章浏览阅读386次。我常常遇到这样的情况:服务器上已经有可悲的是,这样的转换几乎是不可能的,而且我认为这在将来也不会成为可能。很多原因导致该功能在最初不会是一个好想法,而且它会变得越来越不必要。下面就是原因。一开始,磁盘格式的就地转换本身就很危险。当你在给定系统唯一可用的副本上工作时,这是颇具风险的行为。你相信该程序可以立刻操控整个卷,不会有多大失误。如果转换期间某部分出错了,该数据的唯一副本就破坏了。此外,如果该数..._文件系统 ext3怎么把数据导到window

Go语言/golang/位操作/取反/异或/左移/右移-程序员宅基地

文章浏览阅读3.5k次。为什么80%的码农都做不了架构师?>>> ..._go 取反操作

北大AI公开课2019 | 雷鸣:人工智能革命与机遇-程序员宅基地

文章浏览阅读132次。2019年2月20日,北京大学“人工智能前沿与产业趋势”正式开课。本学期的课程邀请到了商汤科技副总裁沈徽、驭势科技CEO吴甘沙、微软亚洲研究院副院长周明、360人工智能研究院院长颜水成、YC中国创始人及CEO、百度集团副董事长陆奇等14位来自产业界的大咖进行授课,我们作为独家合作媒体将全程跟进并对北大这14场公开课进行整理,敬请关注!北大人工智能创新中心主任雷鸣作为课程的发起人与主持人率先开讲。作...

使用顺序Gauss消去法和列主元Gauss消去法给出方程组的计算结果_分别用顺序高斯消去法和列祖元高斯消去法求解下列方程组验证计算结果并分析误-程序员宅基地

文章浏览阅读4.4k次,点赞2次,收藏11次。题目:运算精度设置为单精度,用Matlab编程实现解下列方程组,分别使用顺序Gauss消去法和列主元Gauss消去法给出计算结果,并回答下列问题:计算结果和期望结果是否一致,为什么 给出例子分析计算结果的计算程序 答:主函数程序如下:clc;clear all;digits(8)A=[vpa(10^(-9)) 1;1 1]b=[1;2];x=GaussNaiv..._分别用顺序高斯消去法和列祖元高斯消去法求解下列方程组验证计算结果并分析误

Linux 离线安装 python3.7.4_离线安装linux环境的python3.7.4-程序员宅基地

文章浏览阅读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

matlab读取excel表作图,读取Excel表格数据进行绘图-如何将excel表格中大量数据导入matlab中并作图...-程序员宅基地

文章浏览阅读5k次。matlab 读取excel时间数据并绘图没看懂你的格式是什么意思,不过我一般读取excel都用xlsread函数,你也可以试一试[a,b,c]=xlsresd('data.xls');%r如果是office2007及以上。那就是data.xlsxa b c 是读取不同的数据类型在matlab上如何导入excel表格然后画图工具:MATLAB、office excel步骤将待导入的矩阵结构的数据录..._matlab批量读取excel表格数据并处理画图

随便推点

ImageMagick:png序列转gif(适合处理带透明度的图片)_png序列转透明底gif-程序员宅基地

文章浏览阅读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

java调用cmd进入指定目录并执行任务_java在指定目录调用cmd命令-程序员宅基地

文章浏览阅读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命令

【每周一库】 imgui-rs - Rust下的Dear ImGui binding-程序员宅基地

文章浏览阅读1k次。本期的每周一库带来的是imgui-rs,是一个Rust下的Dear ImGui binding,从名字不难看出,这是一个GUI框架的库下面我们主要参考i..._rust imgui

Android自定义控件之轮播图控件-程序员宅基地

文章浏览阅读52次。为什么80%的码农都做不了架构师?>>> ..._android studio怎么用轮播图组合其他控件

C++内存管理(1)_delete[]为什么逆序-程序员宅基地

文章浏览阅读544次。根据侯捷老师的视频:https://www.bilibili.com/video/BV1Kb411B7N8这篇文章归纳内存管理的面试题和一些知识点梳理正在更新中首先为什么想要内存管理不知道有没有人好奇delete[]或者delete的时候为什么系统会自动这个变量 占了多少字节。答案是因为cookies,每次内存获取的时候,系统都会额外分配4个字节的cookies用来标注这次分配内存会占用多少内存空间。如图:分配了长度为10的int数组,他在调用函数sizeof()的时候是占用了40字节,可是实_delete[]为什么逆序

If you already have a 64-bit JDK installed 解决方法-程序员宅基地

文章浏览阅读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

推荐文章

热门文章

相关标签