zoukankan      html  css  js  c++  java
  • 读取配置文件的C语言接口实现

    在一些场合,需要对一些配置文件进行读取,去设置软件的参数,自己实现了一些接口函数,以供以后使用。

    ConfigFile.c

      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 #include <ctype.h>
      4 #include <direct.h>
      5 #define MAX_LINE_LENGTH    256
      6 
      7 int read_line(FILE *fp, char *bp)
      8 {
      9     char c = '';
     10     int i = 0;
     11     bool isAssgin = 0;
     12     /* Read one line from the source file */
     13     while (1)
     14     {
     15         c = getc(fp);
     16         if (c == '
    ')
     17         {
     18             break;
     19         }
     20 
     21         if (c == '
    ')
     22         {
     23             continue;
     24         }
     25 
     26         if (c == '=')
     27         {
     28             isAssgin = 1;
     29         }
     30 
     31         if (feof(fp))
     32         {
     33             /* return FALSE on unexpected EOF */
     34             if (isAssgin == 1)
     35             {
     36                 bp[i] = '';
     37                 return(1);
     38             }
     39             else
     40             {
     41                 return(0);
     42             }
     43         }
     44         bp[i++] = c;
     45     }
     46     bp[i] = '';
     47     return(1);
     48 }
     49 /************************************************************************
     50 * Function:     Get_private_profile_int()
     51 * Arguments:    <char *> section - the name of the section to search for
     52 *               <char *> entry - the name of the entry to find the value of
     53 *               <int> def - the default value in the event of a failed read
     54 *               <char *> file_name - the name of the .ini file to read from
     55 * Returns:      the value located at entry
     56 *************************************************************************/
     57 int Get_private_profile_int(const char *section, const char *entry, int def, char *file_name)
     58 {
     59     FILE *fp = fopen(file_name, "r");
     60     //Try to fix the issue that the MAX_PATH should be 256, not 80
     61     char buff[MAX_LINE_LENGTH];
     62     char *ep;
     63     char t_section[MAX_LINE_LENGTH];
     64     char value[12];
     65     int len = strlen(entry);
     66     int i;
     67     //To support negative number convert
     68     bool b_IsNegative = false;
     69     if (!fp)
     70     {
     71         return(0);
     72     }
     73     sprintf(t_section, "[%s]", section); /* Format the section name */
     74     /*  Move through file 1 line at a time until a section is matched or EOF */
     75     do
     76     {
     77         if (!read_line(fp, buff))
     78         {
     79             fclose(fp);
     80             return(def);
     81         }
     82     }while (strcmp(buff, t_section));
     83     /* Now that the section has been found, find the entry.
     84      * Stop searching upon leaving the section's area. */
     85     do
     86     {
     87         if (!read_line(fp, buff) || buff[0] == '[') //130516 Willy modify '' to '[' for parser ini bug.
     88         {
     89             fclose(fp);
     90             return(def);
     91         }
     92     }while (strncmp(buff, entry, len));
     93     
     94     ep = strrchr(buff, '=');   /* Parse out the equal sign */
     95     ep++;
     96     if (!strlen(ep))           /* No setting? */
     97     {
     98         return(def);
     99     }
    100     /* Copy only numbers fail on characters */
    101     //To support negative number convert
    102     if (ep[0] == '-')
    103     {
    104         b_IsNegative = true;
    105         for (i = 1; isdigit(ep[i]); i++)
    106         {
    107             value[i - 1] = ep[i];
    108         }
    109         value[--i] = '';
    110     }
    111     else
    112     {
    113         for (i = 0; isdigit(ep[i]); i++)
    114         {
    115             value[i] = ep[i];
    116         }
    117         value[i] = '';
    118     }
    119     fclose(fp);                /* Clean up and return the value */
    120     //To support negative number convert
    121     if (b_IsNegative)
    122     {
    123         return (0 - atoi(value));
    124     }
    125     else  
    126     {
    127         return(atoi(value));
    128     }
    129 }
    130 
    131 
    132 unsigned long long Get_private_profile_longlong(const char *section, const char *entry, unsigned long long def, char *file_name)
    133 {
    134     FILE *fp = fopen(file_name, "r");
    135     char buff[MAX_LINE_LENGTH];
    136     char *ep;
    137     char t_section[MAX_LINE_LENGTH];
    138     char value[16];
    139     int len = strlen(entry);
    140     int i;
    141     if (!fp)
    142     {
    143         return(0);
    144     }
    145     sprintf(t_section, "[%s]", section); /* Format the section name */
    146     /*  Move through file 1 line at a time until a section is matched or EOF */
    147     do
    148     {
    149         if (!read_line(fp, buff))
    150         {
    151             fclose(fp);
    152             return(def);
    153         }
    154     }while (strcmp(buff, t_section));
    155     /* Now that the section has been found, find the entry.
    156      * Stop searching upon leaving the section's area. */
    157     do
    158     {
    159         if (!read_line(fp, buff) || buff[0] == '[') //130516 Willy modify '' to '[' for parser ini bug.
    160         {
    161             fclose(fp);
    162             return(def);
    163         }
    164     }while (strncmp(buff, entry, len));
    165     
    166     ep = strrchr(buff, '=');   /* Parse out the equal sign */
    167     ep++;
    168     if (!strlen(ep))           /* No setting? */
    169     {
    170         return(def);
    171     }
    172     /* Copy only numbers fail on characters */
    173     for (i = 0; isdigit(ep[i]); i++)
    174     {
    175         value[i] = ep[i];
    176     }
    177     value[i] = '';
    178     fclose(fp);                /* Clean up and return the value */
    179     return(_atoi64(value));
    180 }
    181 
    182 /**************************************************************************
    183 * Function:     Get_private_profile_string()
    184 * Arguments:    <char *> section - the name of the section to search for
    185 *               <char *> entry - the name of the entry to find the value of
    186 *               <char *> def - default string in the event of a failed read
    187 *               <char *> buffer - a pointer to the buffer to copy into
    188 *               <int> buffer_len - the max number of characters to copy
    189 *               <char *> file_name - the name of the .ini file to read from
    190 * Returns:      the number of characters copied into the supplied buffer
    191 ***************************************************************************/
    192 int Get_private_profile_string(const char *section, const char *entry, const char *def, char *buffer, int buffer_len, char *file_name)
    193 {
    194 
    195     FILE *fp = fopen(file_name, "r");
    196     char buff[MAX_LINE_LENGTH];
    197     char *ep;
    198     char t_section[MAX_LINE_LENGTH];
    199     int len = strlen(entry);
    200     if (!fp)
    201     {
    202         return(0);
    203     }
    204     sprintf(t_section, "[%s]", section);  /* Format the section name */
    205     /*  Move through file 1 line at a time until a section is matched or EOF */
    206     do
    207     {
    208         if (!read_line(fp, buff))
    209         {
    210             strncpy(buffer, def, buffer_len);
    211             return(strlen(buffer));
    212         }
    213     }while (strcmp(buff, t_section));
    214     /* Now that the section has been found, find the entry.
    215      * Stop searching upon leaving the section's area. */
    216     do
    217     {
    218         if (!read_line(fp, buff) || buff[0] == '[') //130516 Willy modify '' to '[' for parser ini bug.
    219         {
    220             fclose(fp);
    221             strncpy(buffer, def, buffer_len);
    222             return(strlen(buffer));
    223         }
    224     }while (strncmp(buff, entry, len));
    225 
    226     ep = strrchr(buff, '=');   /* Parse out the equal sign */
    227     do
    228     {
    229         ep++;
    230     }while(!strncmp(ep, " ", 1));   //Remove the blank space
    231 
    232     /* Copy up to buffer_len chars to buffer */
    233     strncpy(buffer, ep, buffer_len - 1);
    234     buffer[buffer_len - 1] = '';
    235     fclose(fp);               /* Clean up and return the amount copied */
    236     return(strlen(buffer));
    237 }
    238 int Get_private_profile_hex(const char *section, const char *entry, int def, char *file_name)
    239 {
    240     char valBuf[16], valBuf2[16];
    241     int data;
    242 
    243     memset(valBuf, 0, sizeof(valBuf));
    244     memset(valBuf2, 0, sizeof(valBuf2));
    245 
    246     sprintf(valBuf2, "0x%x", def);
    247     Get_private_profile_string(section, entry, valBuf2, &valBuf[0], sizeof(valBuf), file_name);
    248     data = 0;
    249     sscanf(valBuf, "0x%x", &data);
    250     return data;
    251 }
    252 
    253 /*************************************************************************
    254  * Function:    Write_private_profile_string()
    255  * Arguments:   <char *> section - the name of the section to search for
    256  *              <char *> entry - the name of the entry to find the value of
    257  *              <char *> buffer - pointer to the buffer that holds the string
    258  *              <char *> file_name - the name of the .ini file to read from
    259  * Returns:     TRUE if successful, otherwise FALSE
    260  *************************************************************************/
    261 int Write_private_profile_string(const char *section, const char *entry, char *buffer, char *file_name)
    262 {
    263     FILE *rfp, *wfp;
    264     char tmp_name[15];
    265     //Try to fix the issue that the MAX_PATH should be 256, not 80
    266     char buff[MAX_LINE_LENGTH];
    267     char t_section[MAX_LINE_LENGTH];
    268     int len = strlen(entry);
    269     tmpnam(tmp_name); /* Get a temporary file name to copy to */
    270     sprintf(t_section, "[%s]", section); /* Format the section name */
    271 
    272     rfp = fopen(file_name, "r");
    273     if (!rfp)  /* If the .ini file doesn't exist */
    274     {
    275         wfp = fopen(file_name, "w");
    276         if (!wfp) /*  then make one */
    277         {
    278             return(0);
    279         }
    280         fprintf(wfp, "%s
    ", t_section);
    281         fprintf(wfp, "%s=%s
    ", entry, buffer);
    282         fclose(wfp);
    283         return(1);
    284     }
    285 
    286     wfp = fopen(tmp_name, "w");
    287     if (!wfp)
    288     {
    289         fclose(rfp);
    290         return(0);
    291     }
    292 
    293     /* Move through the file one line at a time until a section is
    294      * matched or until EOF. Copy to temp file as it is read. */
    295     do
    296     {
    297         if (!read_line(rfp, buff))
    298         {
    299             /* Failed to find section, so add one to the end */
    300             fprintf(wfp, "
    %s
    ", t_section);
    301             fprintf(wfp, "%s=%s
    ", entry, buffer);
    302             /* Clean up and rename */
    303             fclose(rfp);
    304             fclose(wfp);
    305             unlink(file_name);
    306             rename(tmp_name, file_name);
    307             return(1);
    308         }
    309         fprintf(wfp, "%s
    ", buff);
    310     }while (strcmp(buff, t_section));
    311 
    312     /* Now that the section has been found, find the entry. Stop searching
    313      * upon leaving the section's area. Copy the file as it is read
    314      * and create an entry if one is not found.  */
    315     while (1)
    316     {
    317         if (!read_line(rfp, buff))
    318         {
    319             /* EOF without an entry so make one */
    320             fprintf(wfp, "%s=%s
    ", entry, buffer);
    321             /* Clean up and rename */
    322             fclose(rfp);
    323             fclose(wfp);
    324             unlink(file_name);
    325             rename(tmp_name, file_name);
    326             return(1);
    327 
    328         }
    329         if (!strncmp(buff, entry, len) || buff[0] == '')
    330         {
    331             break;
    332         }
    333         fprintf(wfp, "%s
    ", buff);
    334     }
    335 
    336     if (buff[0] == '')
    337     {
    338         fprintf(wfp, "%s=%s
    ", entry, buffer);
    339         do
    340         {
    341             fprintf(wfp, "%s
    ", buff);
    342         }
    343         while (read_line(rfp, buff));
    344     }
    345     else
    346     {
    347         fprintf(wfp, "%s=%s
    ", entry, buffer);
    348         while (read_line(rfp, buff))
    349         {
    350             fprintf(wfp, "%s
    ", buff);
    351         }
    352     }
    353     /* Clean up and rename */
    354     fclose(wfp);
    355     fclose(rfp);
    356     unlink(file_name);
    357     rename(tmp_name, file_name);
    358     return(1);
    359 }
    360 
    361 int Write_private_profile_int(const char *section, const char *entry, int data, char *file_name)
    362 {
    363     char valBuf[16];
    364     memset(valBuf, 0, 16);
    365     sprintf(valBuf, "%d", data);
    366     return Write_private_profile_string(section, entry, valBuf, file_name);
    367 }
    368 
    369 unsigned long long Write_private_profile_longlong(const char *section, const char *entry, unsigned long long data, char *file_name)
    370 {
    371     char valBuf[16];
    372     memset(valBuf, 0, 16);
    373     sprintf(valBuf, "%Lu", data);
    374     return Write_private_profile_string(section, entry, valBuf, file_name);
    375 }

    ConfigFile.h

     1 #ifndef _CONFIGFILE_H_
     2 #define _CONFIGFILE_H_
     3 
     4 extern int Get_private_profile_int(const char *section, const char *entry, int def, char *file_name);
     5 extern unsigned long long Get_private_profile_longlong(const char *section, const char *entry, unsigned long long def, char *file_name);
     6 extern int Get_private_profile_string(const char *section, const char *entry, const char *def, char *buffer, int buffer_len, char *file_name);
     7 extern int Get_private_profile_hex(const char *section, const char *entry, int def, char *file_name);
     8 
     9 extern int Write_private_profile_string(const char *section, const char *entry, char *buffer, char *file_name);
    10 extern int Write_private_profile_int(const char *section, const char *entry, int data, char *file_name);
    11 extern unsigned long long Write_private_profile_longlong(const char *section, const char *entry, unsigned long long data, char *file_name);
    12 
    13 #endif //_CONFIGFILE_H_

    测试:

    当前目录下Autoconfig.ini文件的内容为

    测试源码:main.c

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 #include <ctype.h>
     4 #include <direct.h>
     5 #include "GetConfig.h"
     6 #define DEFAULT_INI_FILE "\Autoconfig.ini"
     7 
     8 int main(int argc, char* argv[])
     9 {
    10     char ProductModel[80];
    11     char iniFile[256];
    12     char *buffer;
    13     buffer = getcwd(NULL, 0);
    14     strcpy(iniFile, buffer);
    15     strcat(iniFile,DEFAULT_INI_FILE);
    16 
    17     Get_private_profile_string("Setting", "ProductModel", "SS", ProductModel, sizeof(ProductModel), iniFile);
    18     printf("ProductModel:%s
    ",ProductModel);
    19 
    20     unsigned char enExtendBlock = Get_private_profile_int("FwSetting", "EnExtendBlock", 1, iniFile);
    21     printf("enExtendBlock:%d
    ",enExtendBlock);
    22 
    23     int MPVersion = 100;
    24     Write_private_profile_int("Setting", "MPVersion", MPVersion, iniFile);
    25 
    26     sprintf(ProductModel,"ABCSFE!!221");
    27     Write_private_profile_string("Setting", "ProductModel", ProductModel, iniFile);
    28 
    29 }

  • 相关阅读:
    【翻译自mos文章】 11gR1版本号 asmcmd的新命令--cp、md_backup、md_restore
    Android实现ListView或GridView首行/尾行距离屏幕边缘距离
    iOS-为方便项目开发在pch加入一些经常使用宏定义
    [ACM] FZU 1686 神龙的难题 (DLX 反复覆盖)
    Cocos2d-x Touch事件处理机制
    在linux環境下安裝jprofiler_linux_8_0_2.sh
    QT5 Failed to load platform plugin &quot;windows&quot; 终极解决方式 命令行问题
    我们想要如何子的生活?
    javaEE mvc样例具体解释
    安装Kali Linux操作系统Kali Linux无线网络渗透
  • 原文地址:https://www.cnblogs.com/hwli/p/9253677.html
Copyright © 2011-2022 走看看