Chinaunix首页 | 论坛 | 博客
  • 博客访问: 823024
  • 博文数量: 137
  • 博客积分: 3477
  • 博客等级: 中校
  • 技术积分: 1409
  • 用 户 组: 普通用户
  • 注册时间: 2006-11-30 21:53
文章分类

全部博文(137)

文章存档

2024年(8)

2023年(10)

2022年(4)

2021年(10)

2020年(9)

2018年(1)

2017年(1)

2014年(4)

2013年(3)

2012年(12)

2011年(24)

2010年(2)

2009年(8)

2008年(6)

2007年(34)

2006年(1)

分类: C/C++

2020-11-08 11:06:09

因为工作的需要,写了一个 ini 文件的读取函数,下面的部分是一个简单的读取 ini 文件并分离 ini 文件的节点和对应的每个节中的 key 和 value 的方法。

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <ctype.h>

  5. #ifndef SUCCESS
  6. #define SUCCESS 1
  7. #endif

  8. /* TRIM LEFT */

  9. int rtrim( char *pszString)
  10. {
  11.     int nForwardCursor = 0;
  12.     int nTrailingCursor = 0;
  13.     int bTrim = 1;

  14.     for( nForwardCursor = 0 ; pszString[nForwardCursor] != '\0'; nForwardCursor++ )
  15.         if ( bTrim && isspace( pszString[nForwardCursor] ))
  16.             continue ;
  17.         else {
  18.             bTrim = 0;
  19.             pszString[nTrailingCursor] = pszString[nForwardCursor];
  20.             nTrailingCursor++;
  21.         }
  22.     pszString[nTrailingCursor] = '\0';
  23.     return SUCCESS;
  24. }

  25. /* TRIM RIGHT */
  26. int ltrim( char *pszString )
  27. {
  28.     int nForwardCursor = 0;
  29.     int nTrailingCursor = 0;
  30.     int bTrim = 1;
  31.     for ( nForwardCursor=strlen(pszString)-1;
  32.             nForwardCursor >= 0 && isspace( pszString[nForwardCursor] );
  33.             nForwardCursor-- )
  34.     {
  35.     }
  36.     pszString[nForwardCursor+1] = '\0';
  37.     return SUCCESS;
  38. }

  39. /* TRIM LEFT & RIGHT */
  40. int trim(char *str)
  41. {
  42.     ltrim(str);
  43.     rtrim(str);
  44.     return SUCCESS;
  45. }



  46. char    **read_ini(char *filename,int *iniline)
  47. {
  48.     FILE    *fp;
  49.     char    *str;
  50.     static char    **ini_str;
  51.     int    ini_i;
  52.     int    i,j;

  53.     ini_str = ( char **)malloc(sizeof(char *));
  54.     *ini_str = ( char *)malloc(sizeof(char *)*1024);
  55.     str = ( char *)malloc(sizeof(char)*1024);

  56.     if ( (fp = fopen(filename,"rb")) != NULL )
  57.     {
  58.         ini_i = 0;
  59.         while(!feof(fp))
  60.         {
  61.             bzero(str,1024);
  62.             if ( fgets(str,1024,fp) != NULL )
  63.             {
  64.                 for ( i = 0 ; i < strlen(str); i++ )
  65.                 {
  66.                     /* 切掉 ini 文件中的注释信息 */
  67.                     if ( str[i] == ';' || str[i] == '\n' )
  68.                     {
  69. //                        printf(" == ; == %d \n",i);
  70.                         str[i] = '\0';
  71.                     }
  72.                 }
  73.                 trim(str);
  74.                 if ( str[0] != '\0' && str[0] != '\n') {
  75.                     ini_str[ini_i] = ( char *)malloc(sizeof(char)*1024);
  76.                     snprintf(ini_str[ini_i],1024,"%s",str);
  77. //printf("%s\n",str);
  78.                     ini_i++;
  79.                 }
  80.             }
  81.         }
  82.     }
  83.     fclose(fp);
  84.     *iniline = ini_i;
  85.     return (char **)ini_str;
  86. }



  87. void loadinifile(char *inifilename,int *sec_size)
  88. {
  89.     char    **ini_array;
  90.     int    ini_line;
  91.     int    i,j;
  92.     char    *sec_str,*key_str,*val_str;
  93.     char    *token;

  94.     j = 0 ;

  95.     sec_str = ( char *)malloc(sizeof(char)*64);
  96.     key_str = ( char *)malloc(sizeof(char)*64);
  97.     val_str = ( char *)malloc(sizeof(char)*128);

  98.     ini_array = read_ini(inifilename,&ini_line);
  99.     for ( i = 0; i< ini_line ; i++ )
  100.         printf("%s\n",ini_array[i]);
  101.     for ( i = 0 ; i< ini_line ; i++ )
  102.     {
  103. //printf(" ===%d=== \n",ini_line);
  104.         if ( ini_array[i][0] == '[' )
  105.         {
  106.             snprintf(sec_str,64,"%s",ini_array[i]);
  107. printf("\n=== SEC_NAME = %s \n",sec_str );
  108.             *sec_size++;
  109.         } else {
  110. //printf("=========== SEC_ARRAY====\n");
  111. printf("== KEY_VALUE = %s\n",ini_array[i]);
  112.             token = strtok(ini_array[i],"=");
  113.             while( token != NULL )
  114.             {
  115.                 if ( j %2 == 0 )
  116.                 {
  117.                     snprintf(key_str,64,"%s",token);
  118.                     trim(key_str);
  119. printf("== KEY_STR = %s \n",key_str);
  120.                 } else {
  121.                     snprintf(val_str,128,"%s",token);
  122.                     trim(val_str);
  123. printf("== VAL_STR = %s \n",val_str);
  124.                 }
  125.                 token=strtok(NULL,"=");
  126.                 j++;
  127.             }
  128.         }
  129.     }
  130. }



  131. int main ( int argc , char **argv)
  132. {
  133.     char    **ini_s;
  134.     int    ini_line;
  135.     int    i;
  136. /*
  137.     ini_s = read_ini(argv[1],&ini_line);

  138.     printf(" === %d ===\n",ini_line);

  139.     for ( i = 0; i < ini_line; i++ )
  140.     {
  141.         printf(" == %s =\n",ini_s[i]);
  142.     }

  143. */    
  144.     loadinifile(argv[1],&ini_line);

  145.     return 0;
  146. }



ini 文件的内容如下:

点击(此处)折叠或打开

  1. [PostgreSQL]
  2. Description=ODBC for PostgreSQL
  3. Driver=/usr/lib/psqlodbcw.so
  4. Setup=/usr/lib/libodbcpsqlS.so
  5. Driver64=/usr/lib64/psqlodbcw.so
  6. Setup64=/usr/lib64/libodbcpsqlS.so
  7. FileUsage=1

  8. [MySQL]
  9. Description=ODBC for MySQL
  10. Driver=/usr/lib/libmyodbc5.so
  11. Setup=/usr/lib/libodbcmyS.so
  12. Driver64=/usr/lib64/libmyodbc5.so
  13. Setup64=/usr/lib64/libodbcmyS.so
  14. FileUsage=1

  15. [FreeTDS]
  16. Description=Free Sybase & MS SQL Driver
  17. Driver=/usr/lib/libtdsodbc.so
  18. Setup=/usr/lib/libtdsS.so
  19. Driver64=/usr/lib64/libtdsodbc.so
  20. Setup64=/usr/lib64/libtdsS.so
  21. Port=1433

  22. [MariaDB]
  23. Description=ODBC for MariaDB
  24. Driver=/usr/lib/libmaodbc.so
  25. Driver64=/usr/lib64/libmaodbc.so
  26. FileUsage=1

  27. [MySQL ODBC 8.0 Unicode Driver]
  28. Driver=/usr/lib64/libmyodbc8w.so
  29. UsageCount=1

  30. [MySQL ODBC 8.0 ANSI Driver]
  31. Driver=/usr/lib64/libmyodbc8a.so
  32. UsageCount=1

本程序只是简单的演示了读取 ini 文件到内存中,并将其节点和 key value 分离出来。实际的生产环境还需要考虑注释信息的处理。



阅读(985) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~