ini文件读取
2007-08-23 08:51 ubunoon 阅读(225) 评论(0) 编辑 收藏 举报#define SUCCESS 0
#define NOT_EXIST_FILE 1
#define NOT_OPEN_FILE 2
#define NOT_EXIST_SECTION 3
#define NOT_EXIST_ITEM 4
#define NOT_ENOUGH_MEMORY 5 /*item_value需要比
max_item_value_length还要多的值*/
#define NOT_EXIST_VALUE 6
#define NOT_MATCH_BRACKET 7
#define NOT_EXIST_EQUAL 8
#define SPACE 0x20
#define LEFT_SQUARE_BRACKET '['
#define RIGHT_SQUARE_BRACKET ']'
#define CHINESE_LEFT_SQUARE_BRACKET '【'
#define CHINESE_RIGHT_SQUARE_BRACKET '】'
#define EQUAL_SIGN '='
#define POSTIL ';'
#define MAX_BUFFER_LENGTH (255+1)
#define MAX_ITEM_LENGTH (128)
#define INI (".ini")
#define NOT_FIND_SECTION 0
#define FIND_SECTION 1
#ifdef _cplusplus
#define FALSE false
#define TRUE true
#else
#define FALSE 0
#define TRUE 1
#endif
#ifndef _cplusplus
#define inline /*虽然编译器不支持,可以在C中支持inline用法不出现语法错误*/
#endif
int GetValue(const char *file_name, const char *section_name, const char *item_name, char *item_value,const unsigned int max_item_value_length);
/*
[in] file_name :提供ini的文件名,可以省略后缀名"ini"
section_name :提供ini中的节名,可以省略"[]"
item_name :提供ini中的项目名
max_item_value_length: 提示item_value的最大值
[out] item_value :获取ini中的项目的值
返回值:
no_file: NOT_EXIST_FILE
not_open_file: NOT_OPEN_FILE
no_section: NOT_EXIST_SECTION
no_item: NOT_EXIST_ITEM
no_more_memory NOT_ENOUGH_MEMORY // item_value需要比max_item_value_length
// 还要多的值
no_value: NOT_EXIST_VALUE
[]no_match: NOT_MATCH_BRACKET
no_equal: NOT_EXIST_EQUAL
*/
{
FILE *fp;
char real_file_name[MAX_BUFFER_LENGTH] = {0};
char line_buffer[MAX_BUFFER_LENGTH]={0};
bool section_exist = FALSE;
bool item_exist = FALSE;
bool enough_memory = FALSE;
bool equal_exist = FALSE;
unsigned int equal_position = 0;
/* 文件名设置 */
memset( real_file_name, 0, sizeof(real_file_name) );
strcpy( real_file_name, file_name );
/*判断是否有后缀*/
if(0 != strcmp(&real_file_name[strlen(real_file_name)-4], INI) )
{
strcat(real_file_name, INI ); /* 添加后缀 */
}
/* 打开ini文件 */
fp = fopen(real_file_name,"r");
if( NULL == fp)
return NOT_OPEN_FILE;
while( !feof(fp) )
{
fgets(fp, line_buffer); /* 获取一行的值 */
DeleteBeginningAndEndSpace(line_buffer); /* 删除首尾空 */
if( POSTIL == line_buffer[0] ) /* 注释 */
{
continue;
}
/* 如果节没有找到,判断是否为节,是,判断是否为所需节 */
if( (section_exist == FALSE) && IsSection(line_buffer) &&
FindSection(line_buffer,section_name) )
{
section_exist = TRUE;
}
/*
找到了所需节,那么进行中内容查找,如果在下一个节之前还没有找到item
那么表明没有找到item值
*/
if(section_exist ) /*节已经找到,那么查找节下面的item */
{
equal_position = ItemEqualPosition( line_buffer ); //
if( (equal_position!=0) && /*表明存在等于号*/
FindItem( line_buffer, equal_position,item_name ) )
/* 找到所需要的item了 */
{
item_exist = TRUE;
if( strlen(line_buffer)-equal_position+1 > max_item_value_length )
{
enough_memory = FALSE;
strncpy(value,line_buffer[equal_position+1],
max_item_value_length);
}//if
else
{
enough_memory = TRUE;
strncpy(value,line_buffer[equal_poistion+1],
strlen(line_buffer)-equal_position+1);
}//else
if( equal_position != 0)
equal_position = TRUE;
}//if
}
}
fclose(fp);
if( !section_exist )
return NOT_EXIST_SECTION;
if( section_exist && (!item_exist) )
return NOT_EXIST_ITEM;
if( item_exit && (!enough_memory) )
return NOT_ENOUGH_MEMORY;
if( !equal_exist)
return NOT_EXIST_EQUAL;
}
bool FindItem(const char *string, unsigned int equal_position,const char *item_name )
/*
如果找到了所需的item,那么返回TRUE,否则返回FALSE
*/
{
char item[MAX_ITEM_LENGTH] = {0};
equal_position = ( equal_position>MAX_ITEM_LENGTH ?
MAX_ITEM_LENGTH : equal_position);
strncpy(item, string, equal_position);
item[equal_poistion]='
#define NOT_EXIST_FILE 1
#define NOT_OPEN_FILE 2
#define NOT_EXIST_SECTION 3
#define NOT_EXIST_ITEM 4
#define NOT_ENOUGH_MEMORY 5 /*item_value需要比
max_item_value_length还要多的值*/
#define NOT_EXIST_VALUE 6
#define NOT_MATCH_BRACKET 7
#define NOT_EXIST_EQUAL 8
#define SPACE 0x20
#define LEFT_SQUARE_BRACKET '['
#define RIGHT_SQUARE_BRACKET ']'
#define CHINESE_LEFT_SQUARE_BRACKET '【'
#define CHINESE_RIGHT_SQUARE_BRACKET '】'
#define EQUAL_SIGN '='
#define POSTIL ';'
#define MAX_BUFFER_LENGTH (255+1)
#define MAX_ITEM_LENGTH (128)
#define INI (".ini")
#define NOT_FIND_SECTION 0
#define FIND_SECTION 1
#ifdef _cplusplus
#define FALSE false
#define TRUE true
#else
#define FALSE 0
#define TRUE 1
#endif
#ifndef _cplusplus
#define inline /*虽然编译器不支持,可以在C中支持inline用法不出现语法错误*/
#endif
int GetValue(const char *file_name, const char *section_name, const char *item_name, char *item_value,const unsigned int max_item_value_length);
/*
[in] file_name :提供ini的文件名,可以省略后缀名"ini"
section_name :提供ini中的节名,可以省略"[]"
item_name :提供ini中的项目名
max_item_value_length: 提示item_value的最大值
[out] item_value :获取ini中的项目的值
返回值:
no_file: NOT_EXIST_FILE
not_open_file: NOT_OPEN_FILE
no_section: NOT_EXIST_SECTION
no_item: NOT_EXIST_ITEM
no_more_memory NOT_ENOUGH_MEMORY // item_value需要比max_item_value_length
// 还要多的值
no_value: NOT_EXIST_VALUE
[]no_match: NOT_MATCH_BRACKET
no_equal: NOT_EXIST_EQUAL
*/
{
FILE *fp;
char real_file_name[MAX_BUFFER_LENGTH] = {0};
char line_buffer[MAX_BUFFER_LENGTH]={0};
bool section_exist = FALSE;
bool item_exist = FALSE;
bool enough_memory = FALSE;
bool equal_exist = FALSE;
unsigned int equal_position = 0;
/* 文件名设置 */
memset( real_file_name, 0, sizeof(real_file_name) );
strcpy( real_file_name, file_name );
/*判断是否有后缀*/
if(0 != strcmp(&real_file_name[strlen(real_file_name)-4], INI) )
{
strcat(real_file_name, INI ); /* 添加后缀 */
}
/* 打开ini文件 */
fp = fopen(real_file_name,"r");
if( NULL == fp)
return NOT_OPEN_FILE;
while( !feof(fp) )
{
fgets(fp, line_buffer); /* 获取一行的值 */
DeleteBeginningAndEndSpace(line_buffer); /* 删除首尾空 */
if( POSTIL == line_buffer[0] ) /* 注释 */
{
continue;
}
/* 如果节没有找到,判断是否为节,是,判断是否为所需节 */
if( (section_exist == FALSE) && IsSection(line_buffer) &&
FindSection(line_buffer,section_name) )
{
section_exist = TRUE;
}
/*
找到了所需节,那么进行中内容查找,如果在下一个节之前还没有找到item
那么表明没有找到item值
*/
if(section_exist ) /*节已经找到,那么查找节下面的item */
{
equal_position = ItemEqualPosition( line_buffer ); //
if( (equal_position!=0) && /*表明存在等于号*/
FindItem( line_buffer, equal_position,item_name ) )
/* 找到所需要的item了 */
{
item_exist = TRUE;
if( strlen(line_buffer)-equal_position+1 > max_item_value_length )
{
enough_memory = FALSE;
strncpy(value,line_buffer[equal_position+1],
max_item_value_length);
}//if
else
{
enough_memory = TRUE;
strncpy(value,line_buffer[equal_poistion+1],
strlen(line_buffer)-equal_position+1);
}//else
if( equal_position != 0)
equal_position = TRUE;
}//if
}
}
fclose(fp);
if( !section_exist )
return NOT_EXIST_SECTION;
if( section_exist && (!item_exist) )
return NOT_EXIST_ITEM;
if( item_exit && (!enough_memory) )
return NOT_ENOUGH_MEMORY;
if( !equal_exist)
return NOT_EXIST_EQUAL;
}
bool FindItem(const char *string, unsigned int equal_position,const char *item_name )
/*
如果找到了所需的item,那么返回TRUE,否则返回FALSE
*/
{
char item[MAX_ITEM_LENGTH] = {0};
equal_position = ( equal_position>MAX_ITEM_LENGTH ?
MAX_ITEM_LENGTH : equal_position);
strncpy(item, string, equal_position);
item[equal_poistion]='
/*
*
* Copyright (c) 2011 Ubunoon.
* All rights reserved.
*
* email: netubu#gmail.com replace '#' to '@'
* http://www.cnblogs.com/ubunoon
* 欢迎来邮件定制各类验证码识别,条码识别,图像处理等软件
* 推荐不错的珍珠饰品,欢迎订购 * 宜臣珍珠(淡水好珍珠) */
*
* Copyright (c) 2011 Ubunoon.
* All rights reserved.
*
* email: netubu#gmail.com replace '#' to '@'
* http://www.cnblogs.com/ubunoon
* 欢迎来邮件定制各类验证码识别,条码识别,图像处理等软件
* 推荐不错的珍珠饰品,欢迎订购 * 宜臣珍珠(淡水好珍珠) */