当前位置: 首页 > 编程日记 > 正文

C++读写ini配置文件GetPrivateProfileString()WritePrivateProfileString()

转自:http://hi.baidu.com/andywangcn/blog/item/10ba730f48160eeb37d122e9.html

配置文件中经常用到ini文件,在VC中其函数分别为:

#include <Windows.h> //wince,WMobile.ppc不支持这几个函数

写入.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);函数返回值为string的长度(long型),而从ini文件获得的字符串则保留在目的缓冲器中

读取整形值:UINT GetPrivateProfileInt(LPCTSTR lpAppName,LPCTSTR lpKeyName,INT nDefault,LPCTSTR lpFileName);

其中个参数的意思:

LPCTSTR lpAppName ------- INI文件中的一个字段名

LPCTSTR lpKeyName -------- lpAppName 下的一个键名,也就是里面具体的变量名

LPCTSTR lpDefaut ----------如果没有其前两个参数值,则将此值赋给变量

LPSTR lpReturnedString --------接收INI文件中的值的CString对象,即接收缓冲区

DWORD nSize ------接收缓冲区的大小

LPCTSTR lpFileName --------完整的INI文件路径名

LPCTSTR lpString ---------是键值,也就是变量的值, 必须为LPCTSTR或CString类型

例子:

CString StrName,Strtemp;

int nAge;

StrName = "jacky";

nAge = 13;

WritePrivateProfileString("Student","Name",StrName,"c://setting.ini");

结果:(INI文件中显示如下:)

[Student]

Name=jacky

读取:

CString str;

GetPrivateProfileString(
   CString("Student"),
   CString("Name"),
   CString("NULL"),
   str.GetBuffer(MAX_LENGTH),
   MAX_LENGTH,
   CString("F://Program//Test_Read_ini//debug//hello.ini")
   );

结果:str = "jacky";这里需要注意点就是用完GetBuffer函数后一定要释放(用str.ReleaseBuffer()函数),不然后面再用到SName的其他子函数就会失灵。

3.读入整型值要用另一个WINAPI函数:
UINT GetPrivateProfileInt(
LPCTSTR lpAppName,
LPCTSTR lpKeyName,
INT nDefault,
LPCTSTR lpFileName
);
  这里的参数意义与上相同.使用方法如下:

nStudAge=GetPrivateProfileInt("StudentInfo","Age",10,"c://stud//student.ini");

在GetPrivateProfileString最后一个参数是配置文件路径的参数,此路径只能是绝对路径,不能是相对路径,但现在我需要是我的exe文件能和我的配置文件在一起。因此我使用了GetCurrentDirectory函数。

原代码如下:

CString server_ip;
CString des="";
::GetCurrentDirectory(MAX_PATHLENGTH,des.GetBuffer(MAX_PATHLENGTH));
des.ReleaseBuffer();
des+=
//config.ini;
GetPrivateProfileString("PhoneDemo","Server_IP","",server_ip.GetBufferSetLength(15),15,des);
server_ip.ReleaseBuffer();

注意:在这里使用CString变量时,在使用完GetBuffer后,紧接着一定要使用ReleaseBuffer()函数,才可以进行其他的诸如字符串+操作

 补充四点:

   1.INI文件的路径必须完整,文件名前面的各级目录必须存在,否则写入不成功,该函数返回 FALSE 值.

   2.文件名的路径中必须为 // ,因为在VC++中, // 才表示一个 / .

   3.也可将INI文件放在程序所在目录,此时 lpFileName 参数为: ".//student.ini".

   4.从网页中粘贴源代码时,最好先粘贴至记事本中,再往VC中粘贴,否则易造成编译错误,开始时我也十分不解,好好的代码怎么就不对呢?后来才找到这个方法.还有一些代码中使用了全角字符如:<,\等,也会
造成编译错误.

INI文件编程

    INI文件在系统配置及应用程序参数保存与设置方面,具有很重要的作用,所以可视化的编程一族,如VB、VC、VFP、Delphi等都提供了读写INI文件的方法,其中Delphi中操作INI文件,最为简洁,这是因为Delphi3提供了一个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文件不存在该关键字时返回的缺省值。

五、写入INI文件
  同样的,TInifile类也提供了三种不同的对象方法,向INI文件写入字符串、整型数及布尔类型的关键字。

myinifile.writestring('小节名','关键字',变量或字符串值);
myinifile.writeinteger('小节名','关键字',变量或整型数值);
myinifile.writebool('小节名','关键字',变量或True或False);
  当这个INI文件不存在时,上面的语句还会自动创建该INI文件。
六、删除关键字
  除了可用写入方法增加一个关键字,Tinifile类还提供了一个删除关键字的对象方法:
myinifile.DeleteKey('小节名','关键字');

七、小节操作
  增加一个小节可用写入的方法来完成,删除一个小节可用下面的对象方法:
   myinifile.EraseSection('小节名');
  另外Tinifile类还提供了三种对象方法来对小节进行操作:
  myinifile.readsection('小节名',TStrings变量);可将指定小节中的所有关键字名读取至一个字符串列表变量中;
  myinifile.readsections(TStrings变量);可将INI文件中所有小节名读取至一个字符串列表变量中去。
  myinifile.readsectionvalues('小节名',TStrings变量);可将INI文件中指定小节的所有行(包括关键字、=、值)读取至一个字符串列表变量中去。

八、释放
在适当的位置用下面的语句释放myinifile:
myinifile.distory;
九、一个实例
  下面用一个简单的例子(如图),演示了建立、读取、存贮INI文件的方法。myini.ini文件中包含有"程序参数"小节,和用户名称(字符串)、是否正式用户(布尔值)和已运行时间(整型值)三个关键字。程序在窗体建立读取这些数据,并在窗体释放时写myini.ini文件。
  附源程序清单
unit Unit1;
interface
uses
Windows,Messages,SysUtils,Classes,Graphics,Controls,Forms,Dialogs,inifiles,StdCtrls,ExtCtrls;

type
TForm1 = class(TForm)
    Edit1: TEdit;
    CheckBox1: TCheckBox;
    Edit2: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Timer1: TTimer;
    Label3: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
private
    { Private declarations }
public
    { Public declarations }
end;
var
Form1: TForm1;

implementation
var
myinifile:TInifile;
{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
var filename:string;
begin
filename:=ExtractFilePath(paramstr(0))+'myini.ini';
myinifile:=TInifile.Create(filename);
edit1.Text:= myinifile.readstring('程序参数','用户名称','缺省的用户名称');
edit2.text:= inttostr(myinifile.readinteger('程序参数','已运行时间',0));
checkbox1.Checked:= myinifile.readbool('程序参数','是否正式用户',False);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
myinifile.writestring('程序参数','用户名称',edit1.Text);

myinifile.writeinteger('程序参数','已运行时间',strtoint(edit2.text));
myinifile.writebool('程序参数','是否正式用户',checkbox1.Checked);
myinifile.Destroy;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
edit2.Text:=inttostr(strtoint(edit2.text)+1);
end;

end.
  程序在Pwin95、Delphi3下调试通过。

相关文章:

地图下载2之天超图瓦片格式

接上一篇《地图下载1之天地图瓦片解析》&#xff0c;我们已经知道了天地图的瓦片格式&#xff0c;现在来分析一下超图中瓦片的存储结构。 其实&#xff0c;在GIS领域&#xff0c;只有像ESRI这样强大公司的SHP文件等能通用外&#xff0c;很多数据、格式等都不通用&#xff0c;都…

server 2003登录界面黑屏的解决办法

1、备份注册表&#xff08;为了安全起见&#xff09;具体办法&#xff1a;开始-> 运行窗口输入“regedit.exe”->回车->找到注册表->文件->导出->完成&#xff1b; 2、复制下面的文件内容到记事本然后另存为格式为.reg注册表扩展名导入注册表&#xff1b; Wi…

“学了半年后,我要揭开Python 3宗罪!”

有人曾说&#xff0c;未来只有2种人&#xff0c;会Python的人和....不懂Python的小学生&#xff0c;虽有夸张&#xff0c;这也意味着Python越来越重要了&#xff0c;究竟这门语言厉害在哪里&#xff1f;以下为你总结了Python3宗“罪”&#xff01;Python凭啥这么优秀&#xff1…

连表/子查询/计算的sql

看不懂的sql语句 1.select om.*,money,cus.c_type,cus.c_weixin_name,isnull(cus.c_discount,0) c_discount,isnull(om.o_money-om.o_money*cus.c_discount,0) money1,isnull(money*(i_year_pointi_month_potinti_piece_point),0) money2,isnull((om.o_money-om.o_money*cus.c_…

vc6静态库的生成和调用

1、静态库的生成&#xff1a; 在vc6.0中CtrlN选择Projects下的Win32 Static Library&#xff0c;Project name:SumLib,点击OK&#xff0c;下一页中的两项可选可不选&#xff0c;点击Finish完成。 在此工程中新建lib.h和lib.cpp两个文件&#xff0c;源码如下&#xff1a; //lib.…

实例变量的访问及数据封装

你已经看到处理分数的方法如何通过名称直接访问两个实例变量numerator和denominator。事实上&#xff0c;实例方法总是可以直接访问它的实例变量的。然而&#xff0c;类方法则不能&#xff0c;因为它只处理本身&#xff0c;并不处理任何类实例&#xff08;仔细想想&#xff09;…

清华成立视觉智能研究中心,邓志东任中心主任

整理 | 阿司匹林出品 | AI科技大本营&#xff08;ID: rgznai100&#xff09;6月21日&#xff0c;清华大学人工智能研究院视觉智能研究中心正式成立&#xff0c;清华大学副校长、清华大学人工智能研究院管委会主任尤政院士&#xff0c;清华大学人工智能研究院院长张钹院士出席成…

Java并发编程(一)Thread详解

一、概述 在开始学习Thread之前&#xff0c;我们先来了解一下 线程和进程之间的关系&#xff1a; 线程(Thread)是进程的一个实体&#xff0c;是CPU调度和分派的基本单位。 线程不能够独立执行&#xff0c;必须依存在应用程序中&#xff0c;由应用程序提供多个线程执行控制。 线…

MFC如何打开文件路径

转自&#xff1a;http://linyangmumu.blog.163.com/blog/static/6903134920101024419380/ 1.void OpenFile&#xff08;&#xff09; { CString m_FileDir; BROWSEINFO bi; ZeroMemory(&bi, sizeof(BROWSEINFO)); bi.hwndOwner m_hWnd; bi.ulFlags BIF_RETURNONL…

HDOJ_ACM_数塔

Problem Description在讲述DP算法的时候&#xff0c;一个经典的例子就是数塔问题&#xff0c;它是这样描述的&#xff1a;有如下所示的数塔&#xff0c;要求从顶层走到底层&#xff0c;若每一步只能走到相邻的结点&#xff0c;则经过的结点的数字之和最大是多少&#xff1f;已经…

会数据分析的人别再低调了,我怕你会因此错失100万奖金

大家好我是一般周一不冒头一冒头就不一般的柚柚今天我给大家带来了一个好消息那就是“易观方舟Argo杯数据创客大赛”开始接受报名了&#xff01;请不要怀疑就是那个国内领先的大数据公司——『易观』联合20家创新企业筹备了整整两个月的大赛正规、专业、含金量极高&#xff01;…

CxImage类库的简介

转自&#xff1a;http://www.sudu.cn/info/html/edu/20080403/259688.html CxImage类库是个优秀的图像操作类库。他能快捷地存取、显示、转换各种图像。有的读者可能说&#xff0c;有那么多优秀的图像库&#xff0c;如OpenIL,FreeImage,PaintLib等等&#xff0c;他们可谓是功能…

MySQL 5.5 服务器变量详解(二)

innodb_adaptive_flushing{ON|OFF} 设定是否允许MySQL服务器根据工作负载动态调整刷写InnoDB buffer pool中的脏页的速率。动态调整刷写速率的目的在于避免出现IO活动尖峰。默认值为ON。作用范围为全局级别&#xff0c;可用于选项文件&#xff0c;属动态变量。innodb_adaptive_…

一文掌握异常检测的实用方法 | 技术实践

作者 | Vegard Flovik译者 | Tianyu责编 | Jane出品 | AI科技大本营&#xff08;ID: rgznai100&#xff09;【导读】今天这篇文章会向大家介绍几个有关机器学习和统计分析的技术和应用&#xff0c;并展示如何使用这些方法解决一些具体的异常检测和状态监控实例。相信对一些开发…

票据自动处理系统著名研究团队

国际上对票据自动处理系统的研究始于上世纪80年代&#xff0c;俄罗斯、美国、加拿大、日本、巴西等国在这个领域的研究工作开展得比较深入&#xff0c;著名的研究团体如加拿大Concordia大学的CENPARMI中心、MIT的PROFIT实验室、俄罗斯ABBYY软件公司、Mitek Systems公司CheckQue…

iOS开发之AVKit框架使用

2019独角兽企业重金招聘Python工程师标准>>> iOS开发之AVKit框架使用 一、引言 在iOS开发框架中&#xff0c;AVKit是一个非常上层&#xff0c;偏应用的框架&#xff0c;它是基于AVFoundation的一层视图层封装。其中相关文件和类都十分简单&#xff0c;本篇博客主要整…

DirectX10 学习笔记2:在多文档框架中初始化DirectX 10

显示功能是在视图类中完成的&#xff0c;所以DX10的初始化及绘制工作都是视图类中完成。 首先建立一个多文档工程&#xff0c;工程名为02_01&#xff0c;在视图类头文件中加载相关的库&#xff0c;并包含头文件&#xff1a; 在视图类的头文件中添加DX10相关的成员&#xff1a; …

碾压Bert?“屠榜”的XLnet对NLP任务意味着什么

作者张俊林&#xff0c;中国中文信息学会理事&#xff0c;中科院软件所博士。目前担任新浪微博机器学习团队 AI Lab 负责人。在此之前&#xff0c;张俊林曾经在阿里巴巴任资深技术专家并负责新技术团队&#xff0c;以及在百度和用友担任技术经理及技术总监等职务。他是技术书籍…

ORACLE中通过DBMS_CRYPTO包对表敏感字段进行加密

http://doc.primeton.com/pages/viewpage.action?pageId4917998

02 使用百度地图获得当前位置的经纬度

O 需求 通过百度地图&#xff0c;获取用户当前位置的经纬度 一 准备 确保你已按照上篇《01 如何将百度地图加入IOS应用程序&#xff1f;》完成了相关功能。本篇将在上一篇的基础上进行修改。 二 编码 (New标示本次新添加的代码&#xff1b;Delete表示本次需要删除的代码&#x…

中文NLP的分词真有必要吗?李纪为团队四项任务评测一探究竟 | ACL 2019

作者| Yuxian Meng、Xiaoya Li、Xiaofei Sun、Qinghong Han、Arianna Yuan、 Jiwei Li译者 | Rachel责编 | Jane出品 | AI科技大本营&#xff08;ID: rgznai100&#xff09;【导读】通常&#xff0c;中文文本处理的第一步称为分词&#xff0c;这好像已经成为一种“共识”&#…

Netty 粘包 拆包 编码 解码 序列化 介绍

目录&#xff1a; 粘包 & 拆包及解决方案 ByteToMessageDecoder基于长度编解码器基于分割符的编解码器google 的 Protobuf 序列化介绍其他的前言 Netty 作为一个网络框架&#xff0c;对 TCP 连接中的问题都做了全面的考虑&#xff0c;比如粘包拆包导致的半包问题&#xff0…

matlab 全局变量

转自&#xff1a;http://matlab.net.cn/matlabjichu/2010/201005/265.html 如果你要多于一个函数共用一个简单的变量&#xff0c;简单的处理方法就是把这个变量在所有函数中定义为global全局变量。在命令行做同样的事情&#xff0c;如果你要工作空间访问上述变量。这个全局变量…

java 解决Html table的rowspan问题(osc处女作)

2019独角兽企业重金招聘Python工程师标准>>> 假如有如下html代码需要解析 <table border"1"><tr><td rowspan"3">1</td><td>1</td><td>1</td><td>1</td></tr><tr>&l…

基于C++的OpenCV常用函数

C版本的好处&#xff1a; 1、在于可以尽量避免使用指针这种危险的东西&#xff1b; 2、不用费心去release资源了&#xff0c;因为在其destructor里面&#xff0c;系统会自动帮你搞定。 3、在某些情况下会比C版本运行速度快。 在文件中包含 using namespace cv; 1. i…

基于GAN的图像水印去除器,效果堪比PS高手

作者 | 李翔转载自视说AI&#xff08;ID:techtalkai&#xff09;简介&#xff1a;李翔&#xff0c;国内某互联网大厂AI民工&#xff0c;前携程酒店图像技术负责人&#xff0c;计算机视觉和深度学习重度爱好者&#xff0c;在ICCV和CVPR等会议上发表论文十余篇。写在前面当前互联…

Flink最锋利的武器:Flink SQL入门和实战 | 附完整实现代码

作者 | 机智的王知无转载自大数据技术与架构&#xff08;ID: import_bigdata&#xff09;一、Flink SQL 背景Flink SQL 是 Flink 实时计算为简化计算模型&#xff0c;降低用户使用实时计算门槛而设计的一套符合标准 SQL 语义的开发语言。自 2015 年开始&#xff0c;阿里巴巴开始…

SQL SERVER中ROLLUP的用法

cube操作符 要使用cube&#xff0c;首先要了解group by 其实cube和rollup区别不太大&#xff0c;只是在基于group by 子句创建和汇总分组的可能的组合上有一定差别&#xff0c; cube将返回的更多的可能组合。如果在 group by 子句中有n个列或者是有n个表达式的话&#xff0c; s…

Mybait缓存机制

MyBatis同大多数ORM框架一样&#xff0c;提供了一级缓存和二级缓存的支持。 一级缓存&#xff1a;其作用域为session范围内&#xff0c;当session执行flush或close方法后&#xff0c;一级缓存会被清空。 二级缓存&#xff1a;二级缓存和一级缓存机制相同&#xff0c;但是可以自…

vs2008常用操作汇总

1、OpenCV2.1环境配置&#xff1a; (1)、Tools-->Options-->Projects and Solutions-->VCDrectories&#xff1a; Show directories for选择include files&#xff0c;加入目录 D:/Program Files/OpenCV2.1/include/opencv &#xff1b;Show directories for选择libra…