posts - 45,  comments - 232,  trackbacks - 0

工程:跨平台INI文件读写API(C版本)
版本: 0.2.0
授权方式:GNU GPL
著作权所有(c) 2007 Midapex
    本程序为自由软件;您可依据自由软件基金会所发表的GNU通用公共授权条款规定,就本程序再为发布与/或修改;无论您依据的是本授权的第二版或(您自行选择的)任一日后发行的版本。
   本程序是基于使用目的而加以发布,然而不负任何担保责任;亦无对适售性或特定目的适用性所为的默示性担保。详情请参照GNU通用公共授权。
源代码下载地址:http://www.cppblog.com/Files/dyj057/inifile0.2.0.zip
描述:
版本0.1.0发布以来,没想到这么受大家关注,也提出一些问题。我把问题整理了一下,重写了部分程序,然后发布为0.2.0版本,欢迎大家使用。
旧版本地址:http://www.cppblog.com/dyj057/archive/2006/01/24/3012.html
已测试通过的开发环境:
WinXP、Vista + VC6.0、VS2003、VS2005、VS2008
FC6.0、FC7.0、Ubuntu7.10 + GCC4.1
ARM-Linux+arm-linux-gcc3.3.2

项目特点:
1.使用标准C库函数,支持Windows、Linux、Unix等多平台。
2.实现小巧精致,长期开源支持。
使用示例代码如下:

    1 /**

    2 * @file

    3 * @brief test ini file api

    4 * @author Deng Yangjun

    5 * @date 2007-1-9

    6 * @version 0.2

    7 */

    8 #include <stdio.h>

    9 #include "inifile.h"

   10 

   11 #define BUF_SIZE 256

   12 

   13 int main()

   14 {

   15     const char *file ="myconfig.ini";

   16     const char *section = "student";

   17     const char *name_key = "name";

   18     const char *age_key = "age";

   19     char name[BUF_SIZE]={0};

   20     int age;

   21 

   22     //write name key value pair

   23     if(!write_profile_string(section,name_key,"Tony",file))

   24     {

   25         printf("write name pair to ini file fail\n");

   26         return -1;

   27     }

   28 

   29     //write age key value pair

   30     if(!write_profile_string(section,age_key,"20",file))

   31     {

   32         printf("write age pair to ini file fail\n");

   33         return -1;

   34     }

   35 

   36     printf("[%s]\n",section);

   37     //read string pair, test read string value

   38     if(!read_profile_string(section, name_key, name, BUF_SIZE,"",file))

   39     {

   40         printf("read ini file fail\n");

   41         return -1;

   42     }

   43     else

   44     {

   45         printf("%s=%s\n",name_key,name);

   46     }

   47 

   48     //read age pair, test read int value.

   49     //if read fail, return default value

   50     age = read_profile_int(section,age_key,0,file);

   51     printf("%s=%d\n",age_key,age);

   52 

   53     return 0;

   54 }

   55 


posted on 2007-12-07 10:18 天下无双 阅读(8028) 评论(35)  编辑 收藏 引用 所属分类: C/C++

FeedBack:
# re: 发布C/C++跨平台INI文件读写API V0.2.0
2007-12-07 11:51 | 梦在天涯
谢谢先,看来不错!我也准备近来整理一下常用的class,说不好就把你的当作我的工具了哦1  回复  更多评论
  
# re: 发布C/C++跨平台INI文件读写API V0.2.0
2007-12-07 12:06 | <a href=http://minidx.com>minidxer</a>
支持!这个东西还是挺实用的  回复  更多评论
  
# re: 发布C/C++跨平台INI文件读写API V0.2.0
2007-12-07 13:41 | 天下无双
谢谢大家捧场!  回复  更多评论
  
# re: 发布C/C++跨平台INI文件读写API V0.2.0
2007-12-07 13:57 | 金庆
直觉告诉我,file参数应该放在第一参数的位置.  回复  更多评论
  
# re: 发布C/C++跨平台INI文件读写API V0.2.0
2007-12-07 14:15 | 天下无双
@金庆 参数的顺序是模仿Windows的相同功能的API做的,大家都习惯了,没有必要再搞一套吧。
GetPrivateProfileString

The GetPrivateProfileString function retrieves a string from the specified section in an initialization file.

Note This function is provided only for compatibility with 16-bit Windows-based applications. Applications should store initialization information in the registry.


DWORD GetPrivateProfileString(
LPCTSTR lpAppName,
LPCTSTR lpKeyName,
LPCTSTR lpDefault,
LPTSTR lpReturnedString,
DWORD nSize,
LPCTSTR lpFileName
);

  回复  更多评论
  
# re: 发布C/C++跨平台INI文件读写API V0.2.0
2007-12-07 16:14 | haskell
支持
最喜欢c语言实现的东西了
就是没法像c++写在一个文件里包含就行  回复  更多评论
  
# re: 发布C/C++跨平台INI文件读写API V0.2.0
2007-12-08 00:47 | yeyuboy
建议将api命名成如下:
profile_read_int(const char* profile, const char* section, const char* key, int* value)
profile_read_string(const char* profile, const char* section, const char* key, char* value, unsigned int size)
这样的好处就是比较OO化,容易记忆,易于被IDE的代码完成使用。

另外就是完全遵循windows api,名曰移植到linux,这样不用再学也省去很多使用文档。  回复  更多评论
  
# re: 发布C/C++跨平台INI文件读写API V0.2.0
2007-12-08 13:05 | 天下无双
@yeyuboy 兄弟,说的好啊,我会认真考虑。想改其实也不容易,也要考虑以前版本的兼容性问题。我再想想。
  回复  更多评论
  
# re: 发布C/C++跨平台INI文件读写API V0.2.0
2007-12-08 18:45 | 路过
增加函数的声明, 用DEFINE一下不就行了?
#define A1(X,Y) A(Y,X)

另外,如果是C++就好了,呵呵.  回复  更多评论
  
# re: 发布C/C++跨平台INI文件读写API V0.2.0
2007-12-08 23:21 | 天下无双
@路过 过几天出我用C++封装一下。  回复  更多评论
  
# re: 发布跨平台INI文件读写API(C版本) V0.2.0
2007-12-10 14:15 | 金庆
@天下无双
Windows API GetPrivateProfileXXX() 将文件名参数放在最后,是因为它支持文件名为NULL。  回复  更多评论
  
# re: 发布跨平台INI文件读写API(C版本) V0.2.0
2007-12-11 14:45 | 天下无双
以上的参数顺序问题,在C++版本中已经更新过来了,谢谢大家的意见.  回复  更多评论
  
# re: 发布跨平台INI文件读写API(C版本) V0.2.0
2007-12-13 19:07 | aaa
i found 1 bug

if section is

[aaa-1]
aa=1
[aaa-10]
aa=2
then
find section [aaa-10] will find wrong aa  回复  更多评论
  
# re: 发布跨平台INI文件读写API(C版本) V0.2.0
2007-12-13 19:25 | aaa
if( 0 == strncmp(p+section_start,section:i-section_start)) {

change

if( 0 == strncmp(p+section_start,section,((strlen(section)>i-section_start)?strlen(section):i-section_start))) {  回复  更多评论
  
# re: 发布跨平台INI文件读写API(C版本) V0.2.0
2007-12-17 09:23 | DYJ
谢谢楼上的提醒,我会尽快更新。  回复  更多评论
  
# re: 发布跨平台INI文件读写API(C版本) V0.2.0
2008-01-23 11:17 | yen
十分感谢!我正需要这样一个工具.您帮我大忙  回复  更多评论
  
# re: 发布跨平台INI文件读写API(C版本) V0.2.0
2008-06-03 19:21 | rumor
非常感谢啊,找了个stlplus里的,太大,用得也麻烦,还是你这个实用,  回复  更多评论
  
# re: 发布跨平台INI文件读写API(C版本) V0.2.0
2008-07-09 12:28 |
當我設定兩個變數

width=10
width2=12
我不管用width或者width2回傳都是10

這個問題怎麼解決呢?  回复  更多评论
  
# re: 发布跨平台INI文件读写API(C版本) V0.2.0
2008-07-09 21:37 |
看起來似乎解決了
我把
if(strncmp(key,p+newline_start,j-newline_start)==0)
改為
if(strncmp(key,p+newline_start,strlen(key))==0)

暫時還沒發現問題  回复  更多评论
  
# re: 发布跨平台INI文件读写API(C版本) V0.2.0
2008-08-01 16:22 | 感谢者
非常感谢楼主!!! 非常好用!  回复  更多评论
  
# 确实很好
2008-09-01 15:09 | 火星人
谢谢主人提供的代码,确实很实用,我做C都10多年了,当编写这个的时候还是很手懒,没想到被楼主编写了,实在是太好了,XML和数据库的虽然都有API,但是他们代码都比较大,比如BOA源代码里的类试的也有,但是都不如楼主的这个来的直观,用在潜入式上面非常小巧\简洁\方便.
谢谢您的付出.

xemail@sohu.com
  回复  更多评论
  
# re: 发布跨平台INI文件读写API(C版本) V0.2.0
2009-07-02 18:14 | yingyan
简单,好用,多谢了!  回复  更多评论
  
# re: 发布跨平台INI文件读写API(C版本) V0.2.0
2009-07-26 20:55 | zenghuashan
问题挺多的

[a]
0 = aaa

这样子就读不出来。  回复  更多评论
  
# re: 发布跨平台INI文件读写API(C版本) V0.2.0
2009-10-11 19:02 | neilhhw
下了,要谢谢~~~  回复  更多评论
  
# 谢了,出于实用,我又加了一个。
2010-04-09 09:18 | mmiker
int write_profile_int( const char *section, const char *key,const int value, const char *file)
{
char buf[MAX_FILE_SIZE]={0};
sprintf(buf,"%u",value);
return(write_profile_string((const char *)section, (const char *)key,(const char *)buf, (const char *)file));
}
  回复  更多评论
  
# re: 发布跨平台INI文件读写API(C版本) V0.2.0
2010-04-09 09:25 | mmiker
char buf[MAX_FILE_SIZE]={0};
MAX_FILE_SIZE过于大了,可以改小点。  回复  更多评论
  
# re: 发布跨平台INI文件读写API(C版本) V0.2.0
2010-05-05 08:21 | 路过
谢谢你的提供下载,
if( 0 == strncmp(p+section_start,section, i-section_start))改成
if( (0 == strncmp(p+section_start,section, i-section_start)) && (i-section_start) == strlen(section))

sprintf(w_buf+sec_e,"%s=%s\n",key,value);
sprintf(w_buf+sec_e+strlen(key)+strlen(value)+2,buf+sec_e, file_size - sec_e);改成
sprintf(w_buf+sec_e,"%s=%s\r\n",key,value);
sprintf(w_buf+sec_e+strlen(key)+strlen(value)+3,buf+sec_e, file_size - sec_e);不然的话在windows直接打开会不能换行,有黑块。
  回复  更多评论
  
# re: 发布跨平台INI文件读写API(C版本) V0.2.0
2010-08-02 19:54 | zhetengfengzi

可以参考下 http://blog.csdn.net/ddddfw888/archive/2010/08/02/5783165.aspx, 我已经对这个做了相关的修改。  回复  更多评论
  
# re: 发布跨平台INI文件读写API(C版本) V0.2.0
2011-03-07 04:24 | Genl
key为 port=1800
key为 port1=1800
结果一样 无法区分port port1
strncmp的问题

if('=' == p[j]) {
if(strlen(key) == (j-newline_start)) //x新加入
if(strncmp(key,p+newline_start,j-newline_start)==0)  回复  更多评论
  
# re: 发布跨平台INI文件读写API(C版本) V0.2.0
2011-03-07 09:35 | DYJ
@Genl
谢谢。  回复  更多评论
  
# re: 发布跨平台INI文件读写API(C版本) V0.2.0[未登录]
2011-10-16 13:42 | XXX
什么时候能出新版本啊,我看上面还是有一些Bug的,C++的已经更新到V0.2.1版本了  回复  更多评论
  
# re: 发布跨平台INI文件读写API(C版本) V0.2.0[未登录]
2011-10-16 13:44 | LY
真的十分感谢你的付出,小巧好用,帮了我很大忙啊  回复  更多评论
  
# re: 发布跨平台INI文件读写API(C版本) V0.2.0[未登录]
2011-10-21 17:36 |
这个程序支持多线程吗,如何让其支持多线程啊?  回复  更多评论
  
# re: 发布跨平台INI文件读写API(C版本) V0.2.0
2012-07-26 09:34 | raidenzxx
还不错,虽然短小,但很实用  回复  更多评论
  
# re: 发布跨平台INI文件读写API(C版本) V0.2.0
2014-01-20 11:05 | embeldinux
在linux下gcc编译,运行后,出现无法写的错误  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理



常用链接

留言簿(15)

随笔分类

随笔档案

相册

我的其它领域Blog

搜索

  •  

积分与排名

  • 积分 - 204113
  • 排名 - 130

最新评论

阅读排行榜

评论排行榜