INI文件是很常见的一种配置文件。比如:
-
;Configuration of httphttp
-
[http]
-
domain=www.mysite.com
-
port=8080
-
cgihome=/cgi-bin
-
;Configuration of db
-
[database]server = mysqlmysql
-
user = myname
-
password = toopendatabase
方括号括起来的部分是sectionsection名,之后则是各个key = valuevalue键值对。
等号两边可以有若干个空白字符(空格或Tab ),也可以没有空白字符。
注释是以分号;开始的行。
一个section结束时至少有一个空行,也可以有连续几个空行,空行是仅包括0个或若干个空白字符(空格或Tab )的行。
INI文件的最后一行后面可能有换行符也可能没有。
现在XML兴起了,INI显得有点土。
现在要求编程把INI文件转化为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>
-
<password>toopendatabase</password>
-
</database>
程序实现如下:
-
#include <stdio.h>
-
#include <string.h>
-
-
#define N 1024
-
-
int main(int argc, char **argv)
-
{
-
FILE *fpr = fopen(argv[1], "r");
-
FILE *fpw = fopen(argv[2], "w");
-
char buf[N];
-
char sectionname[N];
-
int sectionflag = 0;
-
int i, j;
-
char *p, *q;
-
-
while(fgets(buf, N, fpr) != NULL)
-
{
-
switch(buf[0])
-
{
-
case '\n':
-
case ' ':
-
case '\t':
-
if(sectionflag == 1)
-
{
-
fprintf(fpw, "%s>\n", sectionname);
-
}
-
sectionflag = 0;
-
break;
-
case ';':
-
buf[strlen(buf)-1] = '\0';
-
fprintf(fpw, "\n", buf+1);
-
break;
-
case '[':
-
buf[strlen(buf)-2] = '\0';
-
fprintf(fpw, "<%s>\n", buf+1);
-
strcpy(sectionname, buf+1);
-
sectionflag = 1;
-
break;
-
default:
-
buf[strlen(buf)-1] = '\0';
-
-
j = 0;
-
-
for(i=0; i<strlen(buf); i++)
-
{
-
if(buf[i]!=' ' && buf[i]!='\t')
-
{
-
buf[j++] = buf[i];
-
}
-
}
-
-
buf[j] = '\0';
-
-
p = strtok(buf, "=");
-
q = strtok(NULL, "=");
-
-
fprintf(fpw, "<%s>%s%s>\n", p, q, p);
-
}
-
}
-
-
if(sectionflag == 1)
-
{
-
fprintf(fpw, "%s>\n", sectionname);
-
}
-
-
fclose(fpr);
-
fclose(fpw);
-
-
return 0;
-
}
阅读(1573) | 评论(0) | 转发(0) |