1 /*
2 * FILE: p670_convert.c
3 * DATE: 20180125
4 * ==============
5 * DESCRIPTION: 将.ini配置文件转换为.xml文件
6 * fgets, fputs, DEBUG(format, ...)调试, strtok切割字符串,
7 */
8
9 #include <stdio.h>
10 #include <string.h>
11
12 #define DEBUG(format, ...) printf("FILE: "__FILE__", LINE: %d: "format"\n", __LINE__, ##__VA_ARGS__)
13 #define BUFFSIZE 64
14
15 int main(int argc, char *argv[])
16 {
17 FILE *fp_src, *fp_dest;
18 char buf[BUFFSIZE];
19 char buf_out[BUFFSIZE];
20 char head[16];
21 char filename[16];
22 int len;
23
24 if(argc != 2)
25 DEBUG("Usage: ./buld filename");
26
27 // 校验文件扩展名是否为.ini 配置文件
28 len = strlen(argv[1]);
29 if(strcmp(argv[1]+len-3, "ini") != 0)
30 DEBUG("source file format error");
31
32 fp_src = fopen(argv[1], "r"); // fopen 配置文件
33
34 // 将.ini配置文件的扩展名改为.xml
35 strcpy(filename, argv[1]);
36 strcpy(&filename[len-3], "xml");
37
38 // fopen .xml文件,若不存在则创建
39 fp_dest = fopen(filename, "w");
40 // 顺序读取每一行
41 while(fgets(buf, BUFFSIZE, fp_src) != NULL)
42 {
43 len = strlen(buf);
44 buf[len-1] = '\0';
45 // 配置信息头
46 if(buf[0] == '#')
47 sprintf(buf_out, "<!-- %s -->\n", buf);
48 else if(buf[0] == '!')
49 {
50 sprintf(buf_out, "<%s>\n", buf+1);
51 strcpy(head, buf+1); // 复制一份用于后面输出</head>
52 }
53 else if(buf[0] == '\0')
54 sprintf(buf_out, "</%s>\n\n", head);
55 else
56 { // strtok 切割字符串并返回首地址
57 char *p = strtok(buf, "=");
58 // strtok第一次调用时需传入字符串首地址,此后传入NULL
59 p = strtok(NULL, "=");
60 sprintf(buf_out, "\t<%s>%s</%s>\n", buf, p, buf);
61 }
62 fputs(buf_out, fp_dest); // fputs 输出
63 }
64 fclose(fp_src); // fclose 关闭文件流
65 fclose(fp_dest);
66 return 0;
67 }