将ini文件转换为xml文件的C小程序

出自宋劲杉老师的《一站式编程》

以前觉得文件了解就好,实现的时候发现其实连了解也算不上~

ini文件由若干个Section组成,由【】起的是名,每个下面由若干个key = value,等号左右可以由若干个空格或TABLE,每行一个等于,以;开头的是注释,两个Section之间有多个空行分格。

现在XML兴起了,INI文件显得有点土。要求将INI文件转换成XML文件

ini

;Configuration of http
[http]
domain=www.mysite.com
port=8080
cgihome=/cgi-bin

;configuration of db
[database]
server = mysql
user = myname
passwoed = toopendatabase

xml

<!-- Configuration of http -->
<http>
    <domain>www.mysite.com</domain>
    <port>8080</port>
    <cgihome>/cgi-bin</cgihome>
</http>

<!-- configuration of db -->
<database>
    <server>mysql</server>
    <user>myname</user>
    <passwoed>toopendatabase</passwoed>
</database>

以下是我写的源码,觉得失败的一点是按行来读,应该整篇读的:

Code:
  1. /*灏咺NI鏂囦欢杞崲涓篨ML鏂囦欢*/  
  2.   
  3. #include<stdio.h>  
  4. #include<stdlib.h>  
  5. #include<string.h>  
  6. #define M 1024  
  7. #define N 100  
  8.   
  9. const char match_char[] = {';''[''='};  
  10.   
  11. /*鍖归厤鍏抽敭瀛楃*/  
  12. /*杩斿洖鍏抽敭瀛楃鍦ㄨ〃涓殑涓嬫爣锛宯甯﹀洖鍏抽敭瀛楃鍦ㄥ瓧绗︿覆涓殑涓嬫爣*/  
  13. int match(const char *str, int *n)  
  14. {  
  15.     int i = 0, len = sizeof(match_char)/sizeof(match_char[0]);  
  16.     const char *p;  
  17.   
  18.     for(i; i < len; i++)  
  19.     {  
  20.         p = str;  
  21.         *n = 0;  
  22.         while(*p != '/0')  
  23.         {  
  24.             if(match_char[i] == *p)  
  25.                 return i;  
  26.             p++;  
  27.             (*n)++;  
  28.         }  
  29.     }  
  30.   
  31.     return -1;  
  32. }  
  33.   
  34. void semicolon(char *buf, FILE *out)  
  35. {  
  36.     fprintf(out, "<!-- %s -->/n", buf + 1);  
  37. }  
  38.   
  39. char * brackets(char *buf, FILE *out)  
  40. {  
  41.     int len = strlen(buf);  
  42.   
  43.     *(buf + len - 1) = '/0';  
  44.   
  45.     fprintf(out, "<%s>/n", buf + 1, buf + 1);  
  46.   
  47.     return buf + 1;  
  48. }  
  49.   
  50. void equal(char *allbuf, FILE *out, int n)  
  51. {  
  52.     int i = 0;  
  53.     char halfbuf[M/2];  
  54.   
  55.     for(i;  (allbuf[i] != ' ') && (allbuf[i] != '   ') && (i < n); i++)  
  56.     {  
  57.         halfbuf[i] = allbuf[i];  
  58.     }  
  59.   
  60.     allbuf = &allbuf[n+1];  
  61.     halfbuf[i] = '/0';  
  62.   
  63.     while(*allbuf == ' '|| *allbuf == ' ')  
  64.         allbuf++;  
  65.   
  66.     fprintf(out, "  <%s>%s</%s>/n", halfbuf, allbuf, halfbuf);  
  67. }  
  68.   
  69. int main(int argc, char *argv[])  
  70. {  
  71.     FILE *in, *out;  
  72.     char *in_name = "1.ini";  
  73.     char *out_name = "1.xml";  
  74.     char buf[M], name[100]={0},*p;  
  75.     int i, n, flag;  
  76.   
  77.     if((in = fopen(in_name, "r")) == NULL)  
  78.     {  
  79.         printf("Can not open %s/n", in_name);  
  80.         exit(0);  
  81.     }  
  82.   
  83.     if((out = fopen(out_name, "w+")) == NULL)  
  84.     {  
  85.         printf("Can not open %s/n", out_name);  
  86.         exit(0);  
  87.     }  
  88.   
  89.     while(!feof(in))  
  90.     {  
  91.         flag = 0;
  92.         do 
  93.         { 
  94.             fgets(buf, M, in); 
  95.             if(flag == 0 && *buf == '/n') 
  96.             { 
  97.                 fprintf(out, "</%s>/n/n", name); 
  98.                 flag = 1; 
  99.             } 
  100.             else if(*buf == '/n') 
  101.             { 
  102.                 fprintf(out, "/n"); 
  103.             } 
  104.  
  105.         }while(*buf == '/n'); 
  106.  
  107.         p = strchr(buf, '/n'); 
  108.         if(p != NULL)  
  109.             *p = '/0';
  110.   
  111.         i = match(buf, &n);  
  112.           
  113.         if(match_char[i] != '=' && n != 0)  
  114.         {  
  115.             printf("ERROR:It's not ini file!/n");  
  116.                   
  117.             exit(0);  
  118.         }  
  119.   
  120.         switch(i)  
  121.         {  
  122.             case 0:  
  123.                 semicolon(buf, out);//鍒嗗彿  
  124.                 break;  
  125.             case 1:  
  126.     //          if(*name != '/0')  
  127.     //              fprintf(out, "</%s>/n", name);  
  128.                 strncpy(name, brackets(buf, out), N);//鏂规嫭鍙?                
  129.                 break;  
  130.             case 2:  
  131.     //          fseek(out, (long)(-(len + 2)), SEEK_END);//鍏夋爣鍥炲埌</string>鍓?                equal(buf, out, n);  
  132.     //          fseek(out, 0, SEEK_END);//鍏夋爣鍥炲埌鏈熬  
  133.                 break;  
  134.             default:  
  135.                 printf("ERROR:No such symbol!/n");  
  136.                 exit(0);  
  137.         }  
  138.     }  
  139.   
  140.     fprintf(out, "</%s>/n", name);  
  141.     fclose(in);  
  142.     fclose(out);  
  143.   
  144.     printf("Sucess!/n");  
  145.   
  146.     return 0;  
  147. }  

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
首先,我们需要使用QSettings类来读取ini文件中的内容。QSettings类提供了一个方便的接口来访问系统注册表、ini文件和其他平台相关位置的设置。 然后,我们可以使用QRegularExpression类将正则表达式字符串转换为QRegularExpression对象,并使用toJson()函数将其转换为JSON格式的字符串。 下面是一个示例代码,可以将ini文件中的正则表达式转换为JSON格式: ```cpp #include <QCoreApplication> #include <QDebug> #include <QSettings> #include <QRegularExpression> #include <QJsonObject> #include <QJsonDocument> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QSettings settings("config.ini", QSettings::IniFormat); QString regExpString = settings.value("RegExp").toString(); QRegularExpression regExp(regExpString); QJsonObject jsonObj; jsonObj["pattern"] = regExp.pattern(); jsonObj["caseSensitivity"] = regExp.caseSensitivity(); jsonObj["minimal"] = regExp.isMinimal(); QJsonDocument jsonDoc(jsonObj); QString jsonString = QString::fromUtf8(jsonDoc.toJson()); qDebug() << "JSON string:" << jsonString; return a.exec(); } ``` 在上面的代码中,我们首先使用QSettings类读取名为“RegExp”的键的值,该键包含正则表达式字符串。然后,我们使用QRegularExpression类将字符串转换为QRegularExpression对象,并将其转换为JSON格式的QJsonObject对象。最后,我们将QJsonObject对象转换为JSON格式的字符串,并将其打印到控制台上。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值