posts - 45,  comments - 175,  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 天下无双 阅读(1658) 评论(21)  编辑 收藏 引用 所属分类: 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
  回复  更多评论
  

标题  
姓名  
主页
验证码 *
内容(提交失败后,可以通过“恢复上次提交”恢复刚刚提交的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
[使用Ctrl+Enter键可以直接提交]
相关链接:
网站导航:

常用链接

留言簿(10)

随笔分类

随笔档案

相册

我的其它领域Blog

搜索

  •  

积分与排名

  • 积分 - 55026
  • 排名 - 42

最新评论

阅读排行榜

评论排行榜