INI文件的读取(C语言:GetPrivateProfileString/GetPrivateProfileInt)
INI文件格式说明
/*********************************************
ini文件说明
ini文件是文本文件,由节点(Section)和键值对(key=value)组成
以';'开头的行为注释
一般形式如下所示:
+--------------- test.ini -----------------+
| [Section1] |
| key1=value1 |
| key2=value2 |
| ;这是注释 |
| [Section2] |
| key3=value3 |
+------------------------------------------+
*********************************************/
更详细的介绍可见http://blog.chinaunix.net/uid-25885064-id-3327199.html
GetPrivateProfileString 从INI文件中读取String值
辅助函数 dupFile
//读取文件内容,保存到在heap区上申请的内存中
//成功返回内存地址,失败返回NULL
//参数fsize用于传出文件的内存区域的大小
char* dupFile(const char* FileName,long* fsize)
{
char* buf = NULL;
long size = ;
//读取文件,因为ini文件通常都很小,所以一次全部读取了
FILE* fp = fopen(FileName,"r");
do{
if(fp == NULL){ //打开文件失败
//puts("打开文件失败");
break;
}
//获取文件大小
if(fseek(fp,,SEEK_END)){
break; //fseek失败
}
size = ftell(fp); //获取当前偏移(文件长度)
if(size<){break;} //读取文件
fseek(fp,,SEEK_SET);
buf = (char*)malloc(size+);
if(buf == NULL){break;}
if(size == fread(buf,,size,fp)){ //fread是阻塞模式,=
buf[size] = '\0';
//文件已经读取完成了
}else{ //万一失败了呢?
free(buf);
buf = NULL;
size = ;
}
}while();
fclose(fp); //关闭文件
if(fsize != NULL){*fsize = size;}
return buf;
}
dupFile
下面代码注释中写的不区分大小写是不对的,是区分大小写的。
/*函数说明:从FileName指定的ini文件中读取section节点下key键对应的value值(字符串)
*参数说明: Section: 节点名(不区分大小写)
* Key: 键名(不区分大小写)
* Default: 没有找到对应的value时的默认值
* ReturnedString: 接收找到的value的缓冲区
* nSize: 缓冲区的大小
* FileName: ini文件路径
*返回值:读取成功返回读取到的value的字符数。如果缓冲区不够大,value会被截断,返回nSize-1
*/
/*函数说明:从FileName指定的ini文件中读取section节点下key键对应的value值(字符串)
*参数说明: Section: 节点名(不区分大小写)
* Key: 键名(不区分大小写)
* Default: 没有找到对应的value时的默认值
* ReturnedString: 接收找到的value的缓冲区
* nSize: 缓冲区的大小
* FileName: ini文件路径
*返回值:读取成功返回读取到的value的字符数。如果缓冲区不够大,value会被截断,返回nSize-1
*/ unsigned long GetPrivateProfileString(
const char* Section, //节点
const char* Key, //键
const char* Default, //默认值
char* ReturnedString, //接收获取值的目标缓冲区
unsigned long nSize, //目标缓冲区大小
const char* FileName //ini文件路径
)
{
FILE* fp; //文件指针
long fsize; //文件大小
long len; //
char* buf; //用于保存文件内容
char* psec; //保存节点位置
char* pkey; //指向文件中key位置
char* pval; //指向文件中value的位置
int iscomment; //用于判读是否是注释
do{
//获取文件内容
buf = dupFile(FileName,&fsize);
if(buf == NULL){break;} //查找节点位置
char sbuf[];
sprintf(sbuf,"[%s]",Section);
psec = strstr(buf,sbuf); //查找节点
if(psec == NULL){
printf("没有找到节点 %s \n",sbuf);
break;//没有找到节点
}
//寻找key
pkey = psec; //查找的起点 //查找key
while((pkey = strstr(pkey,Key))!= NULL){
//找到了匹配的,进入
//判断找到的key是否与传入的一致(避免传入的是找到的前缀)
//如传入 "abc" 找到的是 "abcdef\n"
len = strlen(Key);
pval =pkey + len; //用pval指向pkey的尾部
char t = pval[];
if(t == '=' || t==' ' || t=='\t'){
break; //找到了key,跳出本while
}
//没有找到key,去查找下一个匹配的
}// end while
if(pkey == NULL){
printf("没有找到Key:%s\n",Key);
break; //没有找到key,跳出
}
//确定找到的key是当前节点的(查找key和当前节点之间还有无节点)
pkey[-] = '\0'; //从找到的key前截断
psec = strchr(psec,']') +; //当前节点之后开始找
while((psec=strchr(psec,'[')) != NULL){
//判断该行是否是注释
char* pt = psec++; //psec指向'['的下一个去
while(*(--pt) != ';'&& *pt != '\n');
if(*pt == ';'){ continue;}//是注释,下一个
//不是注释,判断是否是合法节点([]存在,有内容且在同一行)
pt = psec;
while(*(++pt) != ']' && *pt != '\n');
if(*pt==']'){//当前行有']'来闭合,说明Section和Key之间还有节点
pval = NULL; //设置为NULL,表示不用找了
break;
}
}//end while
if(pval == NULL){
break; //找到的key不是传入Section下的
} //确定了找到的key确实与传入的一致,查找value位置
while(*pval != '=' && *pval != '\n' && *pval != '\0'){
++pval; //查找'='的位置(key=value必须在一行)
}
if(*pval != '='){break;} //没有找到value
++pval; //现在pkey指向value(可能用空白,使用sscanf来去除)
// 找到 value 的情况,仅此一处
if((fsize - (pval - buf) - nSize) > ){
pval[nSize-] = '\0'; //避免value太长
}
len = sscanf(pval,"%s",ReturnedString); //sscanf %s 遇到空格\n\t\0都结束
free(buf); //释放buf
return len; //返回拷贝的长度 //结束查找
}while(); //没有找到的情况
strncpy(ReturnedString,Default,nSize-);
ReturnedString[nSize-] = '\0';
free(buf); //释放buf
return strlen(ReturnedString);
}
GetPrivateProfileString
GetPrivateProfileInt从INI文件中读取Int值
/*函数说明:从FileName指定的ini文件中读取section节点下key键对应的value值(整型数)
*参数说明: Section: 节点名(不区分大小写)
* Key: 键名(不区分大小写)
* Default: 没有找到对应的value时的默认值
* FileName: ini文件路径
*返回值:读取成功返回找到的value值。没找到就返回Default
*/ int GetPrivateProfileInt(
const char* Section, // 指向包含 Section 名称的字符串地址
const char* Key, // 指向包含 Key 名称的字符串地址
int Default, // 如果 Key 值没有找到,则返回缺省的值是多少
const char* FileName // ini 文件的文件名
)
{
char buf[];
sprintf(&buf[],"%d",Default); //获取默认值
GetPrivateProfileString(Section,Key,&buf[],buf,,FileName);
return atoi(buf);
}
GetPrivateProfileInt
INI文件的读取(C语言:GetPrivateProfileString/GetPrivateProfileInt)的更多相关文章
- C#对config.ini文件进行读取和修改
C#对config.ini文件进行读取和修改: public partial class Patrolcar : Form之后可以加入如下类: #region public class IniFile ...
- Python3 将configparser从ini文件中读取的内容转换成字典格式
因为写脚本的用到了,所以研究了下怎么将configparser从ini文件中读取的内容转换成字典格式. 整理一下,希望能对大家有帮助. 从http://stackoverflow.com/questi ...
- 【WPS】表格使用VBA宏编程写入ini文件实现软件多语言
前言:公司软件最近在做多语言版本,而又来一个西班牙文版本的,之前已经做过中文版本,英文版本和法文版本,之前是同事做的,现在安排我做,之前的做法,使用wps表格,翻译好,然后一个一个复制粘贴到ini文件 ...
- delphi xe4 ini文件不能读取的解决方法
今天发现用inifiles下 tinifile.readstring方法突然不能读数据了,结果把ini文件格式由utf-8改成unicode后就能正常读取了.
- C#读取ini文件的方法
最近项目用到ini文件,读取ini文件,方法如下: using System; using System.Collections.Generic; using System.Linq; using S ...
- c#读取INI文件
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.I ...
- c#读取INI文件类
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.IO;na ...
- 用C#读取,写入ini文件
[DllImport("kernel32.dll")] private static extern bool WritePrivateProfileString(string se ...
- INI文件,WritePrivateProfileString()和GetPrivateProfileString()函数----转载
INI文件就是扩展名为“ini”的文件.在Windows系统中,INI文件是很多,最重要的就是“System.ini”.“System32.ini”和“Win.ini”.该文件主要存放用户所做的选择以 ...
随机推荐
- 自然语言17_Chinking with NLTK
https://www.pythonprogramming.net/chinking-nltk-tutorial/?completed=/chunking-nltk-tutorial/ 代码 # -* ...
- JSP传统标签开发
1.标签技术的API类继承关系 1).JspTag接口是所有自定义标签的父接口 该接口中没有任何属性和方法,只有两个直接子接口,Tag接口和SimpleTag接口,把实现Tag接口的自定义标签叫做传统 ...
- js 限制input输入字节长度
function WidthCheck(str, maxLen){ var w = 0; var tempCount = 0; //length 获取字数数,不区分汉子和英文 for (var i=0 ...
- 在线考试系统(Online Exam System)--ASP.NET
用户设计 -|学生 -|老师 -|管理员 学生结构设计 -|个人信息管理 -|修改个人信息 -|修改登录密码 -|选课中心 -|显示所有老师所开课的信息可进行选课 -|显示自己已选课程 -|在线考试 ...
- Thread 与 Runnable
在Java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口:Thread类是在java.lang包中定义的.一个类只要继承了Thread类同时覆写了本类中的run() ...
- JS从剪切板里粘贴图片
功能需求:在网页中,Ctrl+V,把系统剪切板的图片(比如QQ截图)进行粘贴.显示.上传...,提高用户体验. 参考链接:https://ruby-china.org/topics/17266 git ...
- Spring实战 (第3版)——依赖注入
首先弄明白几个概念: 1.什么是POJO 2.JavaBean规范 3.EJB(Enterprise JavaBean) 体会Spring如何简化Java开发. 创建应用对象(组件)之间协作关系的行为 ...
- 关于在windows上的wamp集成环境和xampp上安装mongo扩展
今天来学习下mongodb,在装PHP扩展的时候本来是一个很轻松的事情,结果并不是我想想的那么简单. 我的集成环境是xampp的php版本是5.6的x86.我开启了安全模式,所以我需要mongo时ts ...
- solr6.1-----mysql 数据导入-查询
此部分一定要细心,lz 中间错了一个细节,调了好长时间(汗).请严格按照步骤操作 新建core 步骤1: 在webapps中solrhome下新建一个文件夹名字叫做collection1(名字不固定, ...
- 理解button标签的默认行为
button标签的作用和它的名字一样,在绝大多数场合当做按钮来使用. 很多人在使用button按钮的时候出现过这样或者那样的问题,比如:自动提交表单.一次提交表单多次submit行为,有的浏览器下点击 ...