.c源代码如下:(太晚了,没有把颜色都添上,总觉得少了些什么,有时间再添吧!)
/************************************************************ FileName: getini.c // 文件名称 Author: yuanfen127 // 作者 Date: 2005-03-31 // 日期 Description: // 描述本文件的内容,功能,内部各部分之间的关系 // 以及文本文件与其它文件关系等 读取指定ini文件中需要在某段中的具体值 Version: 1.0 // 版本信息 Function List: // 主要函数及其功能 1. open_ini_file 2. close_ini_file 3. get_ini_string 4. cfg_get_key History: // 修改历史记录列表,每条修改记录应包括修改日期、修改 // 者及修改内容简述 1. Date: 2005-03-31 Author: yuanfen127 2. ...***********************************************************/
/*在下面添加 include */#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/stat.h>#include "getini.h"
#define MAX_BUFFER_SIZE 60000#define MAX_VALUE_BUFFER_SIZE 128
static char s_szbuffer[MAX_BUFFER_SIZE]; /*存放文件内容*/static int i_buffer_len=0; /*存放文件大小*/static int i_buffer_changed=0; /*存放改动标志*/static FILE *fp=NULL;
/******************************************************************** Function: OpnIniFile // 函数名称 Description: 打开要操作的文件 // 函数功能、性能等的描述 Calls: // 被本函数调用的函数清单 Input: p_File -- 文件名(相对,绝对路径) Output: // 对输出参数的说明。 Return: // 函数返回值的说明 0 -- 打开文件成功 -1 -- 打开文件错误 -2 -- 读取缓冲区错误 -3 -- 文件太大 Others: // 其它说明**********************************************************************/int open_ini_file(const char *pFile){ /* stat():返回文件的状态(属性). 需要两个参数:文件路径名和一个结构指针,指向状态信息的存放的位置. 结构定义如下: st_mode: 文件类型和存取许可方式 st_ino: I节点号 st_dev: 文件所在设备的ID st_rdev: 特别文件的ID st_nlink: 文件链接数 st_uid: 文件所有者的UID st_gid: 文件小组的GID st_size: 按字节计数的文件大小 st_atime: 最后存取时间(读) st_mtime: 最后修改时间(写)和最后状态的改变 st_ctime: 最后的状态修改时间 返回值: 0:成功 1:失败 */
struct stat statbuf;
stat(pFile,&statbuf); if ( statbuf.st_size > MAX_BUFFER_SIZE ) { fprintf( stderr,"配置文件太大,请缩小配置文件。/n"); fflush(stderr); return -3; }
i_buffer_len = 0; i_buffer_changed = 0; if ( NULL == (fp=fopen(pFile, "rt")) ) { printf("文件不存在或打开文件出错!/n"); return -1; }
/*读到指定长度的位组或到文件尾 EOF*/ /*int fread(void *ptr,int size,int nitems,FILE *stream)*/ /*从流stream中读入nitems个长度为size的字符串存入ptr中*/ if ( 1 != fread(s_szbuffer,statbuf.st_size,1,fp) ) { if (fp != NULL) { fclose(fp); }
fp = NULL; return -2; }
i_buffer_len = statbuf.st_size; return 0; }
/******************************************************************** Function: CloseIniFile // 函数名称 Description: 关闭文件 // 函数功能、性能等的描述 Calls: // 被本函数调用的函数清单 Input: // 对输入参数的说明 Output: // 对输出参数的说明 Return: // 函数返回值的说明 0 -- 关闭文件成功 -1 -- 关闭已打开的文件错误 Others: // 其它说明**********************************************************************/int close_ini_file(void) { if ( fp != NULL) { /*如果缓冲区里的内容被改变,则写入文件再关闭*/ if (i_buffer_changed) { /*将当前文件指针fp移到文件开头*/ rewind(fp); /*int fwrite(void *ptr,int size,int nitems,FILE *stream)*/ /*向流stream中写入nitems个长度为size的字符串,字符串在ptr中*/ fwrite(s_szbuffer, i_buffer_len, 1, fp); }
if (!fclose(fp)) { return 0; } else { return -1; }
} else { return 0; }}
/******************************************************************** Function: GetIniString // 函数名称 Description: 读取字符型数据 // 函数功能、性能等的描述 Calls: // 被本函数调用的函数清单 Input: // 对输入参数的说明 char *s_section : Section Name // 段名 char *s_key: Identity Name // 关键字名 Output: // 对输出参数的说明 char *s_result: Returned string // 返回值 Return: // 函数返回值的说明 0 -- 读取相应值成功 -1 -- 读取相应值失败 Others: // 其它说明**********************************************************************/int get_ini_string(const char *s_section,const char *s_key, char *s_result){ int i=0; /*用于控制读取字符*/ int j=0; /*用于找到值后的指针赋值*/ int min; /*用于存放读取值的位数*/ int i_key_found=-1; /*是否找到段名的标志*/ /*如果段名或关键字或文件为空,返回-1*/ if (!strlen(s_section) || !strlen(s_key) || (fp == NULL)) { return -1; }
while ( i < i_buffer_len ) { /*读取开头为' '或'/t')有多少位,指针向后移动i位*/ while ((i<i_buffer_len) && ((s_szbuffer[i]==' ') || (s_szbuffer[i]=='/t'))) { i++; }
/*如果i大于了文件总长度,则返回-1*/ if (i>=i_buffer_len) { return -1; }
if ( '#' == s_szbuffer[i]) { /*忽略以'#'开头的语句,直到/n*/ while ((i<i_buffer_len) && (s_szbuffer[i] != '/n')) { i++; }
if (i>=i_buffer_len) { return -1; }
/*如果是/n,则移向下一行*/ i++; } else { if ('[' == s_szbuffer[i]) { i++; /*如果[]中前面包括''或/t则往后移*/ while ((i<i_buffer_len) &&((s_szbuffer[i]==' ') || (s_szbuffer[i]=='/t'))) { i++; }
if (i>=i_buffer_len) { return -1; }
if (0 == strncmp(s_szbuffer+i, s_section, strlen(s_section))) { /*从文件内容的i位开始和输入的段名比较,如果相同*/ i += strlen(s_section); /*如果[]中后面包括''或/t则往后移*/ while ((i<i_buffer_len) && ((s_szbuffer[i]==' ') || (s_szbuffer[i]=='/t'))) { i++; }
if (i>=i_buffer_len) { return -1; }
/*如果读取到了']',则改变i_key_found=0*/ if (']' == s_szbuffer[i]) { i_key_found=0; }
i++; /*移动指针直到读取到'/n'*/ while ((i<i_buffer_len) && (s_szbuffer[i]!='/n')) { i++; }
if (i>=i_buffer_len) { return -1; } /*到下一行*/ i++; } else { /*如果没有找到和段名匹配,则一直移动指针到'/n'*/ while ((i<i_buffer_len) && (s_szbuffer[i]!='/n')) { i++; }
if (i>=i_buffer_len) { return -1; }
/*到下一行*/ i++; } } else { if (0 != i_key_found) { /*如果i_key_found为0则说明没有找到匹配的段名,则往后移到'/n'*/ while ((i<i_buffer_len) && (s_szbuffer[i] != '/n')) { i++; }
if (i>=i_buffer_len) { return -1; }
/*到下一行*/ i++; } else { /*如果找了段名匹配,则比较关键字*/ if (0 == strncmp(s_szbuffer+i, s_key, strlen(s_key))) { i += strlen(s_key); if (i>=i_buffer_len) { return -1; } while ((i<i_buffer_len) && ((s_szbuffer[i]=='/t') || (s_szbuffer[i]==' '))) { i++; }
if ( '=' == s_szbuffer[i]) { /*读取=则说明找到了关键字了*/ i++;
/*把要获取的值前面的''和'/t'都过滤掉*/ while ((i<i_buffer_len) && ((s_szbuffer[i]=='/t') || (s_szbuffer[i]==' '))) { i++; }
if (i>=i_buffer_len) { return -1; }
j=i; /*下一指针不为'/n'并且不为'#',则往下读取*/ while ((j<i_buffer_len) && (s_szbuffer[j]!='/n') && (s_szbuffer[j]!='#')) { j++; }
j--; while ((s_szbuffer[j]==' ') || (s_szbuffer[j]=='/t')) { j--; } /*计算获取到的值得总长度*/ min = j-i+1; /*将结果copy到s_result中,加上末尾的'/0',返回0,成功*/ strncpy(s_result, s_szbuffer+i, min); *(s_result+min) = '/0'; return 0; } else { /*如果没有找到=则往下移指针*/ while ((i<i_buffer_len) && (s_szbuffer[i]!='/n')) { i++; }
if (i>=i_buffer_len) { return -1; }
/*到下一行*/ i++; } /*没有找到'='号*/ } else { /*没有找到关键字,往下移指针*/ while ((i<i_buffer_len) && (s_szbuffer[i]!='/n')) { i++; } if (i>=i_buffer_len) { return -1; }
/*移到下一行*/ i++; } } } } } /* while (i<i_buffer_len) */ /*如果没有return0则说明找到,返回-1*/ return -1; }
/******************************************************************** Function: CFG_get_key // 函数名称 Description: 读取字符型数据 // 函数功能、性能等的描述 Calls: // 被本函数调用的函数清单 Input: // 对输入参数的说明 char *pFile: File Name // 文件路径名 char *section : Section Name // 段名 char *key: Identity Name // 关键字名 Output: // 对输出参数的说明 char *val: Returned string // 返回值 Return: // 函数返回值的说明 0 -- 读取相应值成功 -1 -- 读取相应值失败 Others: // 其它说明**********************************************************************/int cfg_get_key(const char *pFile, const char *s_section, const char *s_key, char *s_val){ int ret_code; ret_code = open_ini_file(pFile);
if ( 0 == ret_code) { ret_code = get_ini_string(s_section,s_key,s_val); if (0 == ret_code) { /*找到值了*/ close_ini_file(); return 0; } else { close_ini_file(); printf("在%s中的[%s]段没有找到%s的值./n",pFile,s_section,s_key); return -1; } } close_ini_file(); return -1;}
/******************************************************************** Function: Get_get_ini // 函数名称 Description: 读取整型数据 // 函数功能、性能等的描述 Calls: // 被本函数调用的函数清单 Input: // 对输入参数的说明 char *pFile: File Name // 文件路径名 char *section : Section Name // 段名 char *key: Identity Name // 关键字名 int iDefVal // 默认返回整型值 Output: // 对输出参数的说明 Return: // 函数返回值的说明 s_temp // 返回获取值 iDefVal // 返回默认值 Others: // 其它说明**********************************************************************/int cfg_get_int(const char *pFile, const char *s_section, const char *s_key){ char s_temp[MAX_VALUE_BUFFER_SIZE];
if (0 == cfg_get_key(pFile,s_section,s_key,s_temp)) { /*如果获取的是'0x'或'0X'则为16进制数,转换成十进制数*/ if (strlen(s_temp)>2) { if ((s_temp[0]=='0') && ((s_temp[1]=='x') || (s_temp[1]=='X'))) { /*将字符型通过16进制转换成整型*/ return (int)(strtol(s_temp,(char **)NULL,16)); } } return atoi(s_temp); } return 0;}
/******************************************************************** Function: Get_get_long // 函数名称 Description: 读取长整型数据 // 函数功能、性能等的描述 Calls: // 被本函数调用的函数清单 Input: // 对输入参数的说明 pFile -- 文件路径名 section -- 段名 key -- 关键字名 Output: // 对输出参数的说明 Return: // 函数返回值的说明 // 返回获取值 Others: // 其它说明**********************************************************************/long cfg_get_long(const char *pFile, const char *s_section, const char *s_key){ char s_temp[MAX_VALUE_BUFFER_SIZE];
if (0 == cfg_get_key(pFile,s_section,s_key,s_temp)) { /*如果获取的是'0x'或'0X'则为16进制数,转换成十进制数*/ if (strlen(s_temp)>2) { if ((s_temp[0]=='0') && ((s_temp[1]=='x') || (s_temp[1]=='X'))) { /*将字符型通过16进制转换成长整型*/ return (long)(strtol(s_temp,(char **)NULL,16)); } } return atol(s_temp); } return 0;}
/******************************************************************** Function: Get_get_double // 函数名称 Description: 读取实型数据 // 函数功能、性能等的描述 Calls: // 被本函数调用的函数清单 Input: // 对输入参数的说明 char *pFile: File Name // 文件路径名 char *section : Section Name // 段名 char *key: Identity Name // 关键字名 Output: // 对输出参数的说明 Return: // 函数返回值的说明 s_temp // 返回获取值 Others: // 其它说明**********************************************************************/double cfg_get_double(const char *pFile,const char *s_section,const char *s_key){ char s_temp[MAX_VALUE_BUFFER_SIZE];
if (0 == cfg_get_key(pFile,s_section,s_key,s_temp)) { return atof(s_temp); /*将获取的字符型用atof装换成double型*/ }
return 0.0;}