出自宋劲杉老师的《一站式编程》
以前觉得文件了解就好,实现的时候发现其实连了解也算不上~
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>
以下是我写的源码,觉得失败的一点是按行来读,应该整篇读的:
- /*灏咺NI鏂囦欢杞崲涓篨ML鏂囦欢*/
- #include<stdio.h>
- #include<stdlib.h>
- #include<string.h>
- #define M 1024
- #define N 100
- const char match_char[] = {';', '[', '='};
- /*鍖归厤鍏抽敭瀛楃*/
- /*杩斿洖鍏抽敭瀛楃鍦ㄨ〃涓殑涓嬫爣锛宯甯﹀洖鍏抽敭瀛楃鍦ㄥ瓧绗︿覆涓殑涓嬫爣*/
- int match(const char *str, int *n)
- {
- int i = 0, len = sizeof(match_char)/sizeof(match_char[0]);
- const char *p;
- for(i; i < len; i++)
- {
- p = str;
- *n = 0;
- while(*p != '/0')
- {
- if(match_char[i] == *p)
- return i;
- p++;
- (*n)++;
- }
- }
- return -1;
- }
- void semicolon(char *buf, FILE *out)
- {
- fprintf(out, "<!-- %s -->/n", buf + 1);
- }
- char * brackets(char *buf, FILE *out)
- {
- int len = strlen(buf);
- *(buf + len - 1) = '/0';
- fprintf(out, "<%s>/n", buf + 1, buf + 1);
- return buf + 1;
- }
- void equal(char *allbuf, FILE *out, int n)
- {
- int i = 0;
- char halfbuf[M/2];
- for(i; (allbuf[i] != ' ') && (allbuf[i] != ' ') && (i < n); i++)
- {
- halfbuf[i] = allbuf[i];
- }
- allbuf = &allbuf[n+1];
- halfbuf[i] = '/0';
- while(*allbuf == ' '|| *allbuf == ' ')
- allbuf++;
- fprintf(out, " <%s>%s</%s>/n", halfbuf, allbuf, halfbuf);
- }
- int main(int argc, char *argv[])
- {
- FILE *in, *out;
- char *in_name = "1.ini";
- char *out_name = "1.xml";
- char buf[M], name[100]={0},*p;
- int i, n, flag;
- if((in = fopen(in_name, "r")) == NULL)
- {
- printf("Can not open %s/n", in_name);
- exit(0);
- }
- if((out = fopen(out_name, "w+")) == NULL)
- {
- printf("Can not open %s/n", out_name);
- exit(0);
- }
- while(!feof(in))
- {
- flag = 0;
- do
- {
- fgets(buf, M, in);
- if(flag == 0 && *buf == '/n')
- {
- fprintf(out, "</%s>/n/n", name);
- flag = 1;
- }
- else if(*buf == '/n')
- {
- fprintf(out, "/n");
- }
- }while(*buf == '/n');
- p = strchr(buf, '/n');
- if(p != NULL)
- *p = '/0';
- i = match(buf, &n);
- if(match_char[i] != '=' && n != 0)
- {
- printf("ERROR:It's not ini file!/n");
- exit(0);
- }
- switch(i)
- {
- case 0:
- semicolon(buf, out);//鍒嗗彿
- break;
- case 1:
- // if(*name != '/0')
- // fprintf(out, "</%s>/n", name);
- strncpy(name, brackets(buf, out), N);//鏂规嫭鍙?
- break;
- case 2:
- // fseek(out, (long)(-(len + 2)), SEEK_END);//鍏夋爣鍥炲埌</string>鍓? equal(buf, out, n);
- // fseek(out, 0, SEEK_END);//鍏夋爣鍥炲埌鏈熬
- break;
- default:
- printf("ERROR:No such symbol!/n");
- exit(0);
- }
- }
- fprintf(out, "</%s>/n", name);
- fclose(in);
- fclose(out);
- printf("Sucess!/n");
- return 0;
- }