xnwxq 发表于 2009-8-28 20:30

[原创]Linux下的ini文件的操作C模块子程序

为了更好的丰富论坛的资源查找,程序只供大家参考。各位大侠发现问题要多多指导!
在下面的阐述中将实现ini的读写和删除ini文件的项
关于INI的文件格式大家可以在网上查找一下,这里就不做详细的说明
'.ini的文件结构:
'.ini 文件是文本文件,中间的数据格式一般为:
'
'KeyName1 = value1
'KeyName2 = value2
'...
'
'KeyName1 = value1
'KeyName2 = value2
'.ini 文件可以分为几个 Section
'每个 Section 的名称用 [] 括起来
'在一个 Section 中,可以有很多的 Key
'每一个 Key 可以有一个值并占用一行,格式是 Key=value
'FileName:是文件的路径名称
'Section:是.ini的块名称
'KeyName:是.ini的关键字名称
'Value:是.ini的对应的值

/* INI 文件管理模块: 读, 写和删除 INI 文件中的项.
输出函数:
int ReadIniFileInt( FILE *pIniFile, const char *pSubSet, const char *pItem, int *pValue );
int ReadIniFileString( FILE *pIniFile, const char *pSubSet, const char *pItem, char *pValue );
int WriteIniFileString( char *pIniFilePath, const char *pSubSet, const char *pItem, char *pValue );
int DeleteIniFileItem( char *pIniFilePath, const char *pSubSet, const char *pItem );
*/

xnwxq 发表于 2009-8-28 20:31

本帖最后由 xnwxq 于 2009-8-28 20:32 编辑

/* 描述: 本函数可从一INI文件中取得某个组中某个项的值, 并以整数的方式返回
参数: pIniFileINI文件的文件指针. 它取值为 NULL, 则本函数认为该参数的取值非法. 文件应该以 "r" 模式打开.
    pSubSet组的名字. 它取值为 NULL 或它指向一个空串, 则本函数认为该参数的取值非法.
    pItem   项的名字. 它取值为 NULL 或它指向一个空串, 则本函数认为该参数的取值非法.
    pValue取得的值放在 pValue 中
返回: 返回 0 表示成功, 这时 pValue 数组中将存放所取得的字符串; 返回 -1 表示文件操作失败;
    返回 -2 表示参数非法; 返回 -3 表示INI文件中不包含指定的组或指定的项.
注意: IniFile 必须以标准的INI格式书写, 否则将无法找到所须的项. 该 Ini 文件的每一行的字符数不可多于 250 个. */
int ReadIniFileInt( FILE *pIniFile, const char *pSubSet, const char *pItem, int *pValue ) {
char cTemp, *pTemp;
unsigned uLen;
if ( ( pIniFile == NULL ) || ( pSubSet == NULL ) || ( pItem == NULL ) || ( pValue == NULL ) ) return -2;
if ( ( *pSubSet == '\0' ) || ( *pItem == '\0' ) ) return -2;
rewind( pIniFile );
uLen = strlen( pSubSet );
if ( !uLen ) return -2;
while ( 1 ) {
if ( fscanf( pIniFile, "%s", cTemp ) == EOF ) break;
for ( pTemp = cTemp; ( *pTemp == ' ' ) || ( *pTemp == '\t' ); pTemp ++ );
if ( *pTemp == '[' ) {
   for ( pTemp ++; ( *pTemp == ' ' ) || ( *pTemp == '\t' ); pTemp ++ );
   if ( !strncmp( pTemp, pSubSet, uLen ) ) break;
}
}
uLen = strlen( pItem );
if ( !uLen ) return -2;
while ( 1 ) {
if ( fscanf( pIniFile, "%s", cTemp ) == EOF ) break;
for ( pTemp = cTemp; ( *pTemp == ' ' ) || ( *pTemp == '\t' ); pTemp ++ );
if ( *pTemp == '[' ) return -3;
if ( !strncmp( pTemp, pItem, uLen ) ) {
   pTemp = strrchr( pTemp, '=' );
   for ( pTemp ++; ( *pTemp == ' ' ) || ( *pTemp == '\t' ); pTemp ++ );
   *pValue = atoi( pTemp );
   return 0;
}
}
return -3;
}

xnwxq 发表于 2009-8-28 20:35

本帖最后由 xnwxq 于 2009-8-28 20:37 编辑


我想问一下在发表帖子中如何保持程序的代码风格,我的程序风格如下图所示,复制过来格式就变成上面的格式,感觉比较乱!

xnwxq 发表于 2009-8-28 20:36

/* 描述: 本函数可从一INI文件中取得某个组中某个项的值, 并以字符串的方式返回
参数: pIniFile INI文件的文件指针. 它取值为 NULL, 则本函数认为该参数的取值非法. 文件应该以 "r" 模式打开. pSubSet 组的名字. 它取值为 NULL 或它指向一个空串, 则本函数认为该参数的取值非法. pItem 项的名字. 它取值为 NULL 或它指向一个空串, 则本函数认为该参数的取值非法. pValue 取得的值放在 pValue 中.
返回: 返回 0 表示成功, 这时 pValue 数组中将存放所取得的字符串; 返回 -1 表示文件操作失败; 返回 -2 表示参数非法; 返回 -3 表示INI文件中不包含指定的组或指定的项.
注意: IniFile 必须以标准的INI格式书写, 否则将无法找到所须的项. 该 Ini 文件的每一行的字符数不可多于 250 个. */

qrfbntel 发表于 2013-1-5 15:52

兄弟,在不?你最后一个函数咋个不贴贴呢?我正需要

ymind 发表于 2013-1-6 09:07

Linux下confuse库能实现类似功能,但没有section []支持。
页: [1]
查看完整版本: [原创]Linux下的ini文件的操作C模块子程序