【程序练习】——ini格式转换为xml格式
;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格式的更多相关文章
- elf格式转换为hex格式文件的两种方法
这周工作终于不太忙了,可以写点笔记总结一下了. 之前的文章如何在Keil-MDK开发环境生成Bin格式文件,介绍了如何在Keil开发环境使用fromelf软件,将生成的axf文件转换为bin文件,这次 ...
- 将windows文本格式转换为UNIX格式
将windows文本格式转换为UNIX格式 1.使用sed命令来进行转换,如下: sed -e ’s,^M,,g’ textfile 其中^M的输入方法是Ctrl+V, Ctrl+M 对于批量文件的处 ...
- webm视频转换 其他视频格式转换为webm格式
将其他视频格式转换为webm格式 https://files.cnblogs.com/files/bubuchu/html5videoshipingeshizhuanhuanqi.zip
- PHP中数组转换为XML格式
最近公司要做一个API接口,输出格式要有JSON与XML格式, 在PHP中,输入JSON直接json_encode就可以,但输出XML没有提供函数,于是决定自己写一个. <?php /** * ...
- Java POI 读取Excel数据转换为XML格式
1.首先要下载poi相关的包:http://poi.apache.org/ ,以下是所需的jar包 2.贴上详细的代码 public class ExcelToXml { /** * 将excel的 ...
- jansen字符串转换为xml格式
/// <summary> /// json字符串转换为Xml对象 /// </summary> /// <param name="sJson"> ...
- Sony索尼数码录音笔MSV格式转换为MP3格式【转】
本文转载自:http://blog.sina.com.cn/s/blog_4b2c860f0100d78w.html Sony索尼数码录音笔一般存储为WAV格式,有些没有特意修改存储格式的就保存为MS ...
- 如何将腾讯视频的qlv格式转换为mp4格式
基本上每个视频app都会有自己固有的视频播放格式,比如优酷的KUX.爱奇艺的QSV和腾讯的QLV等.而今天我们重点介绍腾讯的QLV格式如何转换为MP4格式,小便也是经过多次的摸索多次的软件试用,发现的 ...
- uiautomator日志文件转换为xml格式文件
如果想把uiautomator的日志文件,转换成漂亮的xml文件,那么可以使用automator-log-converter.jar工具, 工具使用方法: 使用工具automator-log-conv ...
随机推荐
- js 什么是深拷贝问题?
一.什么是值类型? 二.什么是引用类型? 三.使用ES Next新特性带来的 Object.assign 方法 和 扩展运算符: 四.Object.assign 方法 和 扩展运算符的 “深入浅出” ...
- Maven 使用国内镜像
1 修改maven 的配置文件 settings.xml,添加阿里云的一个中央仓库. 2 找到maven 的配置文件,一般在 maven 安装目录 apache-maven-3.5.0\conf 文件 ...
- Flowable 的event介绍
1 事件分为两种,一种是抛出:当流程执行到这时,抛出一个事件:另一种是捕获:当流程执行到这时,他就会等待一个事件的发生. 一个事件需要有事件定义,否则不会做任何“特殊”的事.对于一个流程实例,一个开始 ...
- Python 实现进程间通信(网络编程)
[网络编程] 1):网络编程是什么意思,网络编程指的是不同机器之间通过网编相互发信息,我们常用的“QQ”,“微信”,“邮箱” 都个网编编程的应用: 网编编程在技术上还有另一个叫法叫“进程间通信”,进程 ...
- js页面加载完后执行(document.onreadystatechange 和 document.readyState)
js页面加载完后执行javascript(document.onreadystatechange 和 document.readyState) document.onreadystatechange ...
- IOS 集成支付宝和邮件发送
列表中自找 :http://blog.csdn.net/sing_sing?viewmode=contents
- Oozie4.2 安装部署、以及example测试
编译: 使用的环境是:Hadoop2.6.0.Spark1.4.0.Hive0.13.1.Sqoop1.4.4 编译Oozie的命令:./mkdistro.sh -Phadoop-2 -Dhadoop ...
- JasperReport学习札记6-JRXML的标签
原文源于:http://langhua9527.iteye.com/blog/402317 JasperReport学习笔记6-JRXML的标签1.<jasperReport>根元素包括很 ...
- 微信小程序调用蓝牙功能控制车位锁
第一次学用微信小程序,项目需要,被逼着研究了一下,功能是调用微信小程序的蓝牙功能,连接上智能车位锁,控制升降,大概步骤及调用的小程序接口API如下: 1.打开蓝牙模块 wx.openBluetooth ...
- ZOJ Problem Set - 1004-Anagrams by Stack
唉!先直接上源码吧!什么时候有时间的再来加说明. #include<iostream> #include<vector> #include<stack> #i ...