vc读写配置文件方法

合集下载

C语言读取写入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 内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。

C技巧:VC读取和分析格式化文本配置文件

C技巧:VC读取和分析格式化文本配置文件

⼤多数的应⽤程序都有需要配置的参数,配置参数的保存有多种⽅法,⽐如采⽤数据库保存、⼆进制⽂件保存、格式化的⽂本⽂件保存,各有优缺点,对于⼀般⼩的安全性要求不⾼应⽤程序,推荐采⽤格式化⽂本⽂件保存⽅式,这样可以节约编辑修改的界⾯编程,使⽤记事本程序编辑即可。

早期的windows就是采⽤的INI格式⽂本⽂件。

现在很多应⽤程序包括⼤型的软件也还在采⽤格式化⽂本⽂件保存配置参数,⽐如Bentely MicroStation GIS平台GEOGRAPHICS8.0。

本⽂给出的就是利⽤VC来读取和分析配置⽂本⽂件,这是笔者这消防监控系统远程终端软件使⽤的⽅法。

同时给出⼀个C++类来封装配置⽂本⽂件的读取分析。

下⾯是我采⽤的配置⽂件的例⼦,包含单个参数定义,表格参数定义,注释: // 协议名称: TL // ⼯程: SQ // 配置⼈: JY #DEFINE_BEGIN //以下为常量定义 //通信参数 @COM_PORT \\\\.\\COM1 //COM⼝ @COM_BAUDRATE 1200 //波特率 @COM_BITSIZE 8 //数据位 number of bits/byte, 4-8 @COM_SBIT 0 // 0,1,2 对应 1, 1.5, 2 @COM_PARITY 0 //0-4对应no,odd,even,mark,space @STATIONNO 0 //终端号 @TCPIP_SERVERIP 192.168.0.10 //服务器IP地址 @TCPIP_PORTNO 3024 //端⼝ #DEFINE_END #TABLE_BEGIN //表格 //编号识别字符串 //例⼦如下 0 Ion Detector, ALU1, L1S43 //测量台2#离⼦烟感探测器报警 1 Thermal Det, ALU1, L1S39 //值班室温感探测器报警 #TABLE_END 语法解释: // 单⾏注释 #DEFINE_BEGIN 单个参数定义的开始标记 #DEFINE_END 单个参数定义的结束标记 #TABLE_BEGIN 表格参数开始标记 #TABLE_END 表格参数结束标记 单个参数的配置: 每个参数⼀⾏:以空格、TAB制表符作为分隔,注释可选,每⾏结束后有Enter键换⾏。

VC++读写软件配置参数的若干方法

VC++读写软件配置参数的若干方法
n me v le a = a 。节 ( c o )是 I I 件 的 另外 一个 基 本 元 素 ,作 u s tn ei N 文
参 数 设 置 是 软 件 的 一 项 常见 功 能 。通 过 记 录 配 置 参 数 ,可 免 去 每次 输入 参 数 的不便 ,使软 件 操作 更 为 简便 。 因此 ,读写 软
用 是 将 属 性 相 同 的 参 数 包 含 起 来 。 节 名 可 由 任 意 英 文 字 符 组
成 ,需 独 占一 行 ,
“ 千静 听 ”则 记 录 了 当前 选 择 的 播放 模 式 等 。记 录 软件 配 置 参 千
计 算机 ,配 置 参 数仍 然 能 保 留 下来 。 ( )将 参 数 写入 系 统 注 册 2
表 ,该 方法 的优 点 在 于无 论 软件 安装 在计 算 机 中 的任 何路 径 ,配 置参 数 均能 正确 读 取 。最 常 见 的应用 是 软件 使 用次 数 限制 ,一 种 简单 的 实现 方法 如 下 :安装 软 件 时 ,将可 用 次数 写 入 系统 注册 表 ( 入前 判 断是 否 已经存 在 ,存 在 则 不 写入 ) 写 ,软 件 每 启 动 一 次将
格 式 如 下 : 『et n a ] Sci N me。注 意 ,节 并 不 支 持 嵌 套 , 即 节 中 o
不 能 包 含 节 。读 写参 数 时 ,需 使 用 节 名 访 问 。 通 常 ,一 个 节 并
没 有 明 确 的 结 束标 志 .一 般 认 为 在 下 一 个 节 声 明 前 或 文 件 结 尾 处 是 节 的 结 束 。 I I 件 的 另 外 一 个 元 素 是 注 释 (o met 。 N 文 C m ns ) 它 以 分 号 “” 开 始 ,直 到 该 行 结 束 ,之 间 的 文 字 被 认 为 是 注 ; 释信 息 ,将 被 忽略 处 理 ,具 体 格 式 为 “ 注 释 信 息 ” ; 。

VC++中对文件的写入和读取

VC++中对文件的写入和读取

VC++中对文件的写入和读取本文介绍两种方法对文件进行读取和写入操作:1、采用fstream 类;2、采用CStdioFile类。

CStdioFile继承自CFile,一个CStdioFile对象代表一个用运行时函数fopen 打开的C 运行时流式文件。

C++中的fstream类,所有的I/O都以这个“流”类为基础的,包括我们要认识的文件I/O。

stream类有两个重要的运算符:插入器(<<)和析取器(>>)。

插入器(<<)即向流输出数据,析取器(>>)即从流中输入数据。

在C++中,对文件的操作是通过stream的子类fstream(file stream)来实现的,所以,要用这种方式操作文件,就必须加入头文件fstream.h。

fstream类包括向“流”输出数据的ofstream类和从“流”中输出数据的ifstream类。

1、文件的写入往文件中写入数据的操作较为简单,这里以fstream类中往文件写入数据为例,介绍VC++中对文件的写入方法。

对于用CstdioFile 类对文件进行写入操作可参看相关资料。

下面给出采用fstream类对文件进行写入操作的代码:#include <fstream.h>ofstream of1;//创建对象of1.open("数据记录.txt",ios::out,filebuf::openprot);//打开文件int i;//定义一个整型变量float f; //定义一个单精度浮点型变量double d; //定义一个双精度浮点型变量i=123;//赋值f=3.478f; //赋值d=859.653; //赋值of1<<i<<’\t’<<f<<’\t’<<d;//写入数据of1.close();//关闭文件运行后打开“数据记录.txt”文件,内容见图1,变量i,f,d已写入文件中。

VC中的文件读写操作

VC中的文件读写操作

VC中的文件读写操作各种关于文件的操作在程序设计中是十分常见,如果能对其各种操作都了如指掌,就可以根据实际情况找到最佳的解决方案,从而在较短的时间内编写出高效的代码,因而熟练的掌握文件操作是十分重要的。

本文将对Visual C++中有关文件操作进行全面的介绍,并对在文件操作中经常遇到的一些疑难问题进行详细的分析。

1.文件的查找当对一个文件操作时,如果不知道该文件是否存在,就要首先进行查找。

MFC中有一个专门用来进行文件查找的类CFileFind,使用它可以方便快捷地进行文件的查找。

下面这段代码演示了这个类的最基本使用方法。

CString strFileTitle;CFileFind finder;BOOL bWorking = finder.FindFile("C:\\windows\\sysbkup\\*.cab");while(bWorking){bWorking=finder.FindNextFile();strFileTitle=finder.GetFileTitle();}2.文件的打开/保存对话框让用户选择文件进行打开和存储操作时,就要用到文件打开/保存对话框。

MFC的类CFileDialog用于实现这种功能。

使用CFileDialog声明一个对象时,第一个BOOL型参数用于指定文件的打开或保存,当为TRUE时将构造一个文件打开对话框,为FALSE时构造一个文件保存对话框。

在构造CFileDialog对象时,如果在参数中指定了OFN_ALLOWMULTISELECT风格,则在此对话框中可以进行多选操作。

此时要重点注意为此CFileDialog对象的m_ofn.lpstrFile 分配一块内存,用于存储多选操作所返回的所有文件路径名,如果不进行分配或分配的内存过小就会导致操作失败。

下面这段程序演示了文件打开对话框的使用方法。

CFileDialog mFileDlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT|OFN_ALLOWMULTISELECT, "All Files (*.*)|*.*||",AfxGetMainWnd());CString str(" ",10000);mFileDlg.m_ofn.lpstrFile=str.GetBuffer(10000);str.ReleaseBuffer();POSITION mPos=mFileDlg.GetStartPosition();CString pathName(" ",128);CFileStatus status;while(mPos!=NULL){pathName=mFileDlg.GetNextPathName(mPos);CFile::GetStatus( pathName, status );}3.文件的读写文件的读写非常重要,下面将重点进行介绍。

c读取配置文件的方法

c读取配置文件的方法

c读取配置文件的方法在C语言中,读取配置文件是一项非常常见的任务。

配置文件通常包含了程序运行时需要的各种参数和设置,因此读取配置文件是程序启动时必须完成的任务之一。

本文将介绍如何使用C语言读取配置文件。

我们需要了解配置文件的格式。

配置文件通常是一个文本文件,其中包含了一系列的键值对。

每个键值对由一个键和一个值组成,中间用等号连接。

例如:```key1=value1key2=value2key3=value3```在C语言中,我们可以使用标准库中的fopen函数打开配置文件。

例如:```cFILE *fp = fopen("config.ini", "r");```这里我们打开了一个名为config.ini的文件,并以只读模式打开。

接下来,我们可以使用标准库中的fgets函数逐行读取配置文件。

例如:```cchar line[256];while (fgets(line, sizeof(line), fp)) {// 处理每一行}```这里我们定义了一个长度为256的字符数组line,然后使用fgets 函数逐行读取配置文件。

fgets函数的第一个参数是一个字符数组,用于存储读取到的行;第二个参数是字符数组的长度;第三个参数是文件指针,用于指定要读取的文件。

接下来,我们需要解析每一行的键值对。

我们可以使用标准库中的strtok函数将每一行按照等号分割成键和值。

例如:```cchar *key = strtok(line, "=");char *value = strtok(NULL, "=");```这里我们使用strtok函数将line按照等号分割成两个部分,分别是键和值。

strtok函数的第一个参数是要分割的字符串;第二个参数是分割符,这里是等号。

strtok函数会返回分割后的第一个部分,我们可以使用NULL作为第一个参数来获取分割后的第二个部分。

vc文件读写使用

CFile和CStdioFile的文件读写使用方法(2009-08-18 10:35:01)标签:杂谈CFile//创建/打开文件CFile file;file.Open(_T("test.txt"),CFile::modeCreate|CFile::modeNoTruncate|CFile::modeRead Write);文件打开模式可组合使用,用“|”隔开,常用的有以下几种:CFile::modeCreate:以新建方式打开,如果文件不存在,新建;如果文件已存在,把该文件长度置零,即清除文件原有内容。

CFile::modeNoTruncate:以追加方式打开,如果文件存在,打开并且不将文件长度置零,如果文件不存在,会抛出异常。

一般与CFile::modeCreate一起使用,则文件不存在时,新建一个文件;存在就进行追加操作。

CFile::modeReadWrite:以读写方式打开文件。

CFile::modeRead:只读。

CFile::modeWrite:只写。

//写入数据CString strValue = "Hello World!";file.Write(strValue,strValue.GetLength());//追加数据file.SeekToEnd(); //将指针移至文件末尾进行追加file.Write(strValue,strValue.GetLength());//关闭文件file.Close();CStdioFileCStdioFile是CFile的派生类,对文件进行流式操作,对于文本文件的读写很有用处,可按行读取写入。

//写入数据CString strValue = "Hello World!";file.WriteString(strValue);//读取数据CString strRead;file.ReadString(strRead);当文件存在多行数据需要逐行读取时,可用函数BOOL CStdioFile::ReadString(CString& rString),当遇到"\n "时读取截断,如果文件未读完,返回true,否则返回false。

VC++添加菜单并读写ini文件数据

VC++添加菜单并读写ini文件数据1、打开VC++6.0,选择新建。

2、选择“工程”,选择“MFC AppWizard(exe)”,选择工程所建立的位置,并输入工程名。

单击“确定”。

3、在弹出的对话框中选择“基本对话框(D)”,点击“下一步”。

4、在弹出的想到对话框中取消“‘关于’对话框”(可省略该步)。

点击“完成”。

5、在弹出的对话框中直接点击“确定”。

6、在“ResourceView”标签下,在“Testresources”上单击右键,再弹出菜单中选择“插入”。

7、在弹出对话框中选择“Menu”,并点击“新建”。

8、弹出下面的对话框,选择“Menu”,并选中所要编辑的菜单,这里是“IDR_MENU”,在右边的编辑区编辑菜单。

9、双击菜单区中白色方框,弹出“菜单项目属性”对话框,在“标明”框中输入要显示的菜单项。

这里随便输入一个,说明操作方法和效果。

我们输入“文件(&W)”,括号内表示快捷键。

10、在“文件”菜单出现之后,其下面会再有一个白色框的空白区域,表示下拉菜单。

双击,出现“菜单项目属性”对话框,输入“ID”(必须)和“标明”,我们在“标明”中输入“操作ini\t(Ctrl+A)”,“操作ini”表示要显示的菜单项,“(Ctrl+A)”表示快捷键,“\t”会将所有下拉菜单的快捷键自动对齐。

11、还可以选择“分隔符”,在前面的小方框内打勾,会出现一个分隔符。

12、按照上述方法设计好菜单。

13、将所设计的菜单加入对话框。

在“TestDlg.cpp”的OnInitDialog函数中中加入下面代码:CMenu m_menu;m_menu.LoadMenu(IDR_MENU1);SetMenu(&m_menu);如下图所示:14、运行程序,看是否有误,如果无误,会出现下图所以的结果。

15、在“ResourceView”标签下,在“Dialog”上单击右键,再弹出菜单中选择“插入Dialog”。

VC++读写文件

目录目录第1章读写文件 (1)1.1 API (1)1.2 低级IO (1)1.2.1 文件序号 (1)1.2.2 文本文件与二进制文件 (1)1.3 流IO (2)1.4 Unicode (3)1.5 低级IO、流IO、API之间的关系 (3)1.6 随机读写 (3)1.7 C++IO流 (4)1.8 MFC (4)1.8.1 CFile (4)1.8.2 CStdioFile (4)1.8.3 CArchive (4)1.9 总结 (4)II第1章读写文件1.1 API使用VC++读写文件,最直接、最高效的方法就是使用 Windows API,如:使用 CreateFile 打开文件,使用 WriteFile 写文件,使用 ReadFile 读文件……Windows 平台下,所有对文件的读写操作,最终都会调用这些 API 函数。

使用 API 的效率最高,对文件读写的控制最强,缺点就是比较复杂,而且代码没有可移植性。

1.2 低级IO为了方便移植 UNIX 的C代码,VC++的C运行时库实现了一套低级IO 函数,如:_open、_write、_read……1.2.1 文件序号_open返回的是一个整数,MSDN上称其为文件句柄(file handle),这与CreateFile返回的文件句柄容易混淆。

为此,本文称_open返回的为文件序号。

VC++中,系统预先打开了三个文件,其文件序号如下表所示流文件序号说明stdin 0 标准输入设备,一般就是键盘stdout 1 标准输出设备,一般就是控制台stderr 2 标准错误输出设备,一般就是控制台也就是说,无需调用_open,可以直接调用_write(1,"abc",3);往控制台输出a bc三个字符。

1.2.2 文本文件与二进制文件读写二进制文件时,不会做任何处理,数据保持原样。

写文本文件时,V1C++会将换行符(即\n,0AH)替换为回车(即\r,0DH)和换行符;读文本文件时,VC++会将\r\n替换为\n,并且在读取到1AH时,认为文件结束。

VC6.0 MFC 读写配置文件

MFC读写ini配置文件Email:liping_xiong@1.新建头文件如:ini.h,在编辑区域粘贴以下内容://///////////////////////////////////////////////////////////////////////// ini.h: interface for the Cini class.#if !defined(AFX_OPINI_H__CE3F8B7B_1ACA_46CC_A91C_F8E23FA9B063__INCLUDED _)#define AFX_OPINI_H__CE3F8B7B_1ACA_46CC_A91C_F8E23FA9B063__INCLUDED_#if _MSC_VER > 1000#pragma once#endif // _MSC_VER > 1000#include <afxwin.h>class Cini{public:static DWORD ReadString (char *section, char * key, char stringtoread[], char * filename);static BOOL WriteString(LPCTSTR section, LPCTSTR key,char* stringtoadd, char*filename);Cini();virtual ~Cini();};#endif// !defined(AFX_OPINI_H__CE3F8B7B_1ACA_46CC_A91C_F8E23FA9B063__INCLUDED_)2.新建资源文件如:ini.cpp,在编辑区域黏贴以下内容://///////////////////////////////////////////////////////////////////////// ini.cpp: implementation of the Cini class.#include "stdafx.h"#include "ini.h"///////////////////////////////////////////////////////////////////////////Cini类的构造函数和析构函数Cini::Cini(){}Cini::~Cini(){}///////////////////////////////////////////////////////////////////////////写字符串到INI文件,GetLastError()函数用于返回写入失败void error(LPSTR lpszFunction){CHAR szBuf[80];DWORD dw = GetLastError();sprintf(szBuf, "%s failed: GetLastError returned %u\n",lpszFunction, dw);MessageBox(NULL, szBuf, "Error", MB_OK);ExitProcess(dw);}BOOL Cini::WriteString(LPCTSTR section, LPCTSTR key, char *stringtoadd, char *filename) {CHAR FilePath[255];GetModuleFileName(NULL,FilePath,255);(strrchr(FilePath,'\\'))[1] = 0;strcat(FilePath,filename);return ::WritePrivateProfileString(section,key,stringtoadd,FilePath);}///////////////////////////////////////////////////////////////////////////从INI文件中读取字符串DWORD Cini::ReadString(char *section, char * key, char stringtoread[], char * filename) {CHAR FilePath[255];GetModuleFileName(NULL,FilePath,255);(strrchr(FilePath,'\\'))[1] = 0;strcat(FilePath,filename);return ::GetPrivateProfileString(section, key,NULL,stringtoread,255,FilePath);}3.当程序加载的时候读配置文件:首先要在应用程序文件头部引用ini.h头文件如下:#include "ini.h"找到OnInitDialog()函数,在其下黏贴如下代码:// 保存ini各项值数组char szOption1[MAX_PATH];char szOption2[MAX_PATH];char szOption3[MAX_PATH];// 读取ini各项值Cini::ReadString("配置信息", "选项1", szOption1, "test.ini");Cini::ReadString("配置信息", "选项2", szOption2, "test.ini");Cini::ReadString("配置信息", "选项3", szOption3, "test.ini");m_strEdit1.Format("%s",szOption1);m_strEdit2.Format("%s",szOption2);m_strEdit3.Format("%s",szOption3);UpdateData(FALSE);说明:m_strEdit1,m_strEdit2,m_strEdit2是三个文本框对象的实例4.当卸载(关闭)程序的时候写配置文件;找到DestroyWindow()函数,在其下黏贴如下代码:UpdateData(TRUE);CString str1 = m_strEdit1;CString str2 = m_strEdit2;CString str3 = m_strEdit3;char *p1 = str1.GetBuffer(str1.GetLength()+1);char *p2 = str2.GetBuffer(str2.GetLength()+1);char *p3 = str3.GetBuffer(str3.GetLength()+1);Cini::WriteString("配置信息", "选项1", p1, "test.ini");Cini::WriteString("配置信息", "选项2", p2, "test.ini");Cini::WriteString("配置信息", "选项3", p3, "test.ini");说明:m_strEdit1,m_strEdit2,m_strEdit2是三个文本框对象的实例附工程视图及运行结果:Ini头文件Ini资源文件引用头文件引用头文件用户文件、应用程序文件对话框加载关闭对话框配置文件里的记录。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

vc 用函数读写INI配置文件ini文件(即Initialization file),这种类型的文件中通常存放的是一个程序的初始化信息。

ini文件由若干个节(Section)组成,每个Section由若干键(Key)组成,每个Key可以赋相应的值。

读写ini文件实际上就是读写某个的Section中相应的Key的值,而这只要借助几个函数即可完成。

一、向ini文件中写入信息的函数1. 把信息写入系统的win.ini文件BOOL WriteProfileString(LPCTSTR lpAppName, // 节的名字,是一个以0结束的字符串LPCTSTR lpKeyName, // 键的名字,是一个以0结束的字符串。

若为NULL,则删除整个节LPCTSTR lpString // 键的值,是一个以0结束的字符串。

若为NULL,则删除对应的键)2. 把信息写入自己定义的.ini文件BOOL WritePrivateProfileString(LPCTSTR lpAppName, // 同上LPCTSTR lpKeyName, // 同上LPCTSTR lpString, // 同上LPCTSTR lpFileName // 要写入的文件的文件名。

若该ini文件与程序在同一个目录下,也可使用相对//路径,否则需要给出绝度路径。

)如:::WriteProfileString("Test","id","xym");//在win.ini中创建一个Test节,并在该节中创建一个键id,其值为xym::WritePrivateProfileString("Test","id","xym","d:\\vc\\Ex1\\ex1.ini" );//在Ex1目录下的ex1.ini中创建一个Test节,并在该节中创建一个键id,其值为xym//若Ex1.ini文件与读写该文件的程序在同一个目录下,则上面语句也可写为:::WritePrivateProfileString("Test","id","xym",".\\ex1.ini");需要注意的是,C系列的语言中,转义字符'\\'表示反斜线'\'。

另外,当使用相对路径时,\\前的.号不能丢掉了。

二、从ini文件中读取数据的函数1、从系统的win.ini文件中读取信息(1) 读取字符串DWORD GetProfileString(LPCTSTR lpAppName, // 节名LPCTSTR lpKeyName, // 键名,读取该键的值LPCTSTR lpDefault, // 若指定的键不存在,该值作为读取的默认值LPTSTR lpReturnedString, // 一个指向缓冲区的指针,接收读取的字符串DWORD nSize // 指定lpReturnedString指向的缓冲区的大小)如:CString str;::GetProfileString("Test","id","Error",str.GetBuffer(20),20);(2) 读取整数UINT GetProfileInt(LPCTSTR lpAppName, // 同上LPCTSTR lpKeyName, // 同上INT nDefault // 若指定的键名不存在,该值作为读取的默认值)如使用以下语句写入了年龄信息:::WriteProfileString("Test","age","25");//在win.ini中创建一个Test节,并在该节中创建一个键age,其值为25则可用以下语句读取age键的值:int age;age=::GetProfileInt("Test","age",0);2、从自己的ini文件中读取信息(1) 读取字符串DWORD GetPrivateProfileString(LPCTSTR lpAppName, // 同1(1)LPCTSTR lpKeyName, // 同1(1)LPCTSTR lpDefault, // 同1(1)LPTSTR lpReturnedString, // 同1(1)DWORD nSize, // 同1(1)LPCTSTR lpFileName // 读取信息的文件名。

若该ini文件与程序在同一个目录下,也可使用相//对路径,否则需要给出绝度路径。

)如:CString str;::GetPrivateProfileString("Test","id","Error",str.GetBuffer(20),20,".\\ex1.ini");或:::GetPrivateProfileString("Test","id","Error",str.GetBuffer(20),20,"d:\\vc\\Ex1\\ex1.ini");(2) 读取整数UINT GetPrivateProfileInt(LPCTSTR lpAppName, // 同上LPCTSTR lpKeyName, // 同上INT nDefault, // 若指定的键名不存在,该值作为读取的默认值LPCTSTR lpFileName // 同上)如使用以下语句写入了年龄信息:::WritePrivateProfileString("Test","age","25",".\\ex1.ini");//在ex1.ini中创建一个Test节,并在该节中创建一个键age,其值为25则可用以下语句读取age键的值:int age;age=::GetPrivateProfileInt("Test","age",0,".\\ex1.ini");三、删除键值或节回顾一下WriteProfileString函数的说明BOOL WriteProfileString(LPCTSTR lpAppName, // 节的名字,是一个以0结束的字符串LPCTSTR lpKeyName, // 键的名字,是一个以0结束的字符串。

若为NULL,则删除整个节LPCTSTR lpString // 键的值,是一个以0结束的字符串。

若为NULL,则删除对应的键)由此可见,要删除某个节,只需要将WriteProfileString第二个参数设为NULL即可。

而要删除某个键,则只需要将该函数的第三个参数设为NULL即可。

这是删除系统的win.ini中的节或键,类似的,要删除自己定义的ini文件中的节或键,也可做相同的操作。

如:::WriteProfileString("Test",NULL,NULL); //删除win.ini中的Test节::WriteProfileString("Test","id",NULL); //删除win.ini中的id键::WritePrivateProfileString("Test",NULL,NULL,".\\ex1.ini"); //删除ex1.ini中的Test节::WritePrivateProfileString("Test","id",NULL,".\\ex1.ini"); //删除ex1.ini中的id键四、如何判断一个ini文件中有多少个节要判断一个ini文件中有多少个节,最简单的办法就是将所有的节名都找出来,然后统计节名的个数。

而要将所有的节名找出来,使用GetPrivateProfileSectionNames函数就可以了,其原型如下:DWORD GetPrivateProfileSectionNames(LPTSTR lpszReturnBuffer, // 指向一个缓冲区,用来保存返回的所有节名DWORD nSize, // 参数lpszReturnBuffer的大小LPCTSTR lpFileName // 文件名,若该ini文件与程序在同一个目录下,//也可使用相对路径,否则需要给出绝度路径)下面的是用来统计一个ini文件中共有多少个节的函数,当然,如果需要同时找到每个节中的各个键及其值,根据找到节名就可以很容易的得到了。

/*统计共有多少个节节名的分离方法:若chSectionNames数组的第一字符是'\0'字符,则表明有0个节。

否则,从chSectionNames数组的第一个字符开始,顺序往后找,直到找到一个'\0'字符,若该字符的后继字符不是 '\0'字符,则表明前面的字符组成一个节名。

若连续找到两个'\0'字符,则统计结束*/int CTestDlg::CalcCount(void){TCHAR chSectionNames[2048]={0}; //所有节名组成的字符数组char * pSectionName; //保存找到的某个节名字符串的首地址int i; //i指向数组chSectionNames的某个位置,从0开始,顺序后移int j=0; //j用来保存下一个节名字符串的首地址相对于当前i的位置偏移量int count=0; //统计节的个数//CString name;//char id[20];::GetPrivateProfileSectionNames(chSectionNames,2048,".\\ex1.ini");for(i=0;i<2048;i++,j++){if(chSectionNames[0]=='\0')break; //如果第一个字符就是0,则说明ini中一个节也没有if(chSectionNames[i]=='\0'){pSectionName=&chSectionNames[i-j]; //找到一个0,则说明从这个字符往前,减掉j个偏移量,//就是一个节名的首地址j=-1; //找到一个节名后,j的值要还原,以统计下一个节名地址的偏移量//赋成-1是因为节名字符串的最后一个字符0是终止符,不能作为节名//的一部分/*::GetPrivateProfileString(pSectionName,"id","Error",id,20,". \\ex1.ini");name.Format("%s",id);*///在获取节名的时候可以获取该节中键的值,前提是我们知道该节中有哪些键。

相关文档
最新文档