;Configuration of http
[http]
doamin=www.mysite.com
port=
cgihome=/cgi-bin
 
;Configuration of db
[database]
server = mysql
user = myname
password = toopendatabase

转换为:

 <!-- Configuration of http -->
<http>
   <doamin>www.mysite.com</doamin>
   <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>
#include <errno.h>
#include <stdlib.h> void INI_to_XML()
{
FILE *ini,*xml; //声明两个文件流
//声明两个缓冲区
char buf[]; //存放父节点,即http,database
char dbuf[]; //存放子节点和子节点的值,即doamin=www.mysite.com```````
char ch; //定义一个变量用来获取文件的当前位置字符
int i = ;
char *kay,*value; //用来分割子节点和子节点的值用到的指针 if((ini = fopen("inifile.txt","r")) == NULL){ //打开源文件
perror("open inifile.txt");
exit();
} if((xml = fopen("xml","aw+")) == NULL){ //打开目标文件
perror("open xml");
exit();
} while((ch = fgetc(ini)) != EOF){ //一直读到文件的末尾
if(ch == ';'){ //根据源文件特性进行判断
i = ;
memset(buf,,sizeof(buf)); //初始化缓存区
while((ch = fgetc(ini)) != '\r') //windows下的文件一行的结束符用‘\r’'\n'来表示
buf[i++] = ch;
fseek(ini,,SEEK_CUR); //把文件指针偏移到下一行
fprintf(xml,"<!--%s-->\n",buf); //把缓冲区的数据写入文件
continue;
} if(ch == '['){
i = ;
memset(buf,,sizeof(buf));
while((ch = fgetc(ini)) != ']')
buf[i++] = ch;
fseek(ini,,SEEK_CUR);
fprintf(xml,"<%s>\n",buf);
continue;
}
if(ch != '\n' && ch != '\r' && ch != ' '){
memset(dbuf,,sizeof(buf));
i = ;
while((ch = fgetc(ini)) != '\r')
dbuf[i++] = ch;
kay = strtok(dbuf,"="); //分割字符串
value = strtok(NULL,"=");
fprintf(xml,"\t<%s>%s</%s>\n",kay,value,kay);
fseek(ini,,SEEK_CUR);
continue;
}
if(ch == '\n') //当子节点和其值全部写入文件后,即把父节点的结尾补全
fprintf(xml,"</%s>\n",buf); }
fprintf(xml,"</%s>\n",buf); //把最后一个父节点结尾写入到文件 //关闭文件
fcolse(xml);
fcolse(ini);
} int main(int argc, char *argv[])
{
INI_to_XML();
return ;
}

关于代码中文件偏移的解释;

  由于此ini格式的文件在windows下编辑的时候会按照windows的模式格式化文件,会在每行的结尾添加‘\r’'\n'。因此ini文件转换成字符串应该是:

;Configuration of http\r\n[http]\r\ndomain=www.mysite.com\r\nport=8080\r\ncgihome=/cgi-bin\r\n

\r\n

;Configuration of db\r\n[database]\r\nserver = mysql\r\nuser = myname\r\npassword = toopendatabase\r\n

如果不设置文件偏移,父节点的结束符很难写入到文件中,当用到了文件偏移的时候,每次读取完需要的数据时候就会把文件中的\r\n 略过从而使文件直接读取下一个有效字符,当段数据全部写入文件时

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

全部写入文件时,此时文件有一个空行,也就是多出了一对\r\n 这时候我们就可以用这对\r\n 来判断什么时候写入父节点的结尾。

还需要注意的是,当文件读取完之后,就不会再有多余的\r\n来提醒程序写入父节点的结尾到文件中,所以还要加上一个写入父节点的语句;

【程序练习】——ini格式转换为xml格式的更多相关文章

  1. elf格式转换为hex格式文件的两种方法

    这周工作终于不太忙了,可以写点笔记总结一下了. 之前的文章如何在Keil-MDK开发环境生成Bin格式文件,介绍了如何在Keil开发环境使用fromelf软件,将生成的axf文件转换为bin文件,这次 ...

  2. 将windows文本格式转换为UNIX格式

    将windows文本格式转换为UNIX格式 1.使用sed命令来进行转换,如下: sed -e ’s,^M,,g’ textfile 其中^M的输入方法是Ctrl+V, Ctrl+M 对于批量文件的处 ...

  3. webm视频转换 其他视频格式转换为webm格式

    将其他视频格式转换为webm格式 https://files.cnblogs.com/files/bubuchu/html5videoshipingeshizhuanhuanqi.zip

  4. PHP中数组转换为XML格式

    最近公司要做一个API接口,输出格式要有JSON与XML格式, 在PHP中,输入JSON直接json_encode就可以,但输出XML没有提供函数,于是决定自己写一个. <?php /** * ...

  5. Java POI 读取Excel数据转换为XML格式

    1.首先要下载poi相关的包:http://poi.apache.org/  ,以下是所需的jar包 2.贴上详细的代码 public class ExcelToXml { /** * 将excel的 ...

  6. jansen字符串转换为xml格式

    /// <summary> /// json字符串转换为Xml对象 /// </summary> /// <param name="sJson"> ...

  7. Sony索尼数码录音笔MSV格式转换为MP3格式【转】

    本文转载自:http://blog.sina.com.cn/s/blog_4b2c860f0100d78w.html Sony索尼数码录音笔一般存储为WAV格式,有些没有特意修改存储格式的就保存为MS ...

  8. 如何将腾讯视频的qlv格式转换为mp4格式

    基本上每个视频app都会有自己固有的视频播放格式,比如优酷的KUX.爱奇艺的QSV和腾讯的QLV等.而今天我们重点介绍腾讯的QLV格式如何转换为MP4格式,小便也是经过多次的摸索多次的软件试用,发现的 ...

  9. uiautomator日志文件转换为xml格式文件

    如果想把uiautomator的日志文件,转换成漂亮的xml文件,那么可以使用automator-log-converter.jar工具, 工具使用方法: 使用工具automator-log-conv ...

随机推荐

  1. java中多个数字运算后值不对(失真)处理方法

    最近遇到一个bug ,在java里面计算两个数字相减,633011.20-31296.30 得到的结果居然是601714.8999999999,丢失精度了,原来这是Java浮点运算的一个bug. 解决 ...

  2. JavaScript监听手机物理返回键的两种解决方法

    JavaScript没有监听物理返回键的API,所以只能使用 popstate 事件监听. 有两个解决办法: 1.返回到指定的页面 pushHistory(); window.addEventList ...

  3. kafaka学习

    创建一个topic: [root@hdp1 bin]# ./kafka-topics. --replication-factor --partitions --topic justin Created ...

  4. jQueryUI modal dialog does not show close button (x) JQueryUI和BootStrap混用时候,右上角关闭按钮显示不出图标的解决办法

    I had this problem and was able to resolve it with the declaration below. $.fn.bootstrapBtn = $.fn.b ...

  5. [na]tcp&udp层各协议小结

    TCP和UDP 传输层功能: 可靠性:序列号.确认号&flag位 有效性:win滑动窗口 这篇目录索引: Tcp可靠性 Tcp流控 Tcp拥塞控制 Tcp运输连接管理 TCP的可靠性和流控 为 ...

  6. Windows: 打开关闭网络连接的方法

    在Cmd中键入 netsh interface set interface name="本地连接" admin=disablednetsh interface set interf ...

  7. performance Counter

    Logman https://technet.microsoft.com/en-us/library/bb490956.aspx http://blogs.technet.com/b/askperf/ ...

  8. angular内置过滤器-filter

    这篇文章来讲解一下angular内置的filter过滤器. 没错,这个过滤器的名字,就叫'filter',虽然自定义过滤器也是使用module.filter()...但是不要混淆了,这个filter就 ...

  9. [AWS vs Azure] 云计算里AWS和Azure的探究(6) - Amazon Simple Storage Service 和 Microsoft Azure Blob Storage

    这几天Nasuni公司出了一份报告,分析了各个云厂商的云存储的性能,包括Amazon S3,Azure Blob Storage, Google Drive, HP以及Rackspace.其中性能上A ...

  10. 每日英语:Welcome to the Global Middle-Class Surge

    The mass uprisings this summer in Egypt, Turkey and Brazil are powerful reminders that the middle cl ...