;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. haproxy 日志配置

    haproxy日志配置 haproxy在默认情况不会记录日志,除了在haproxy.conf中的global段指定日志的输出外,还需要配置系统日志的配置文件.下面以centos6.4为例,haprox ...

  2. Android log 日志分析

    一. Log 日志中 Bug 类型 程序异常强制关闭: Force Close ,Fatal 程序无响应: Application Not Response , ANR(应用无响应).一般是主线程超时 ...

  3. ActionBar 笔记

    博客地址: http://blog.csdn.net/eclipsexys/article/details/8688538 官方文档: http://developer.android.com/gui ...

  4. Java集合框架:EnumMap

    EnumMap定义 package java.util; import java.util.Map.Entry; import sun.misc.SharedSecrets; public class ...

  5. 未能为数据库 '*'中得对象'*'分配空间,因文件组'PRIMARY'已满

    服务器使用mssqlserver2005,最近经常出现无法新增信息错误,查看日志,发现严重错误提示,内容大致为: 无法为数据库 'weixin_main' 中的对象 'dbo.wx_logs'.'PK ...

  6. Mysql 管理和备份

    mysqladmin用于管理MySQL服务器的客户端,mysqladmin执行管理操作的客户程序,可以用它来创建或删除数据库,重载授权表,将表刷新到硬盘上,以及重新打开日志文件,检索版本.进程,以及服 ...

  7. 每日英语:Chinese Show Global Real-Estate Appetite

    Chinese investors have been snapping up real estate in the world's most important cities this year. ...

  8. python(35):多线程读取文件

    多线程读取文件: # _*_coding:utf-8_*_ import time, threading, ConfigParser ''' Reader类,继承threading.Thread @_ ...

  9. FFmpeg Basic学习笔记(3)

    视频叠加--画中画效果 overlay video filter 视频叠加比较常见的应用场景是台标的叠加,在画面左上角.右上角.左下角或右下角叠加台标. ffmpeg提供的overlay filter ...

  10. 苹果电脑快速安装双系统 Winclone镜像包 Winclone安装Win7/Win8.1/Win10镜像

    原文:https://bbs.feng.com/read-htm-tid-9940193.html by:旋律 2015年及以后的安装win8.1及win10(不支持win7) 请根据自己的机型安装合 ...