【程序练习】——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 ...
随机推荐
- springboot 与 mybatis 中事务特性讲解
1 MyBatis自动参与到 spring 事务管理中,无需额外配置,只要org.mybatis.spring.SqlSessionFactoryBean引用的数据源与 DataSourceTrans ...
- Jacobi并行拆解
作者:桂. 时间:2018-04-23 21:12:02 链接:http://www.cnblogs.com/xingshansi/p/8921815.html 前言 本文主要是复数矩阵分解的拆解思 ...
- telegraf input的配置
.操作系统基础监控指标配置标准 基础监控使用通用的全局配置文件telegraf.conf,以下只贴上采集器input部分代码 telegraf -config /etc/telegraf/telegr ...
- Vue(四):实例化第一个Vue应用
实例化语法 var vm = new Vue({ // 选项 }) Vue 构造器中的内容 <!DOCTYPE html> <html> <head> <me ...
- IOS UIView自动调整尺寸
自动尺寸调整行为 当您改变视图的边框矩形时,其内嵌子视图的位置和尺寸往往也需要改变,以适应原始视图的新尺寸.如果视图的autoresizesSubviews属性声明被设置为YES,则其子视图会根据au ...
- sqlite: Error Code : 5 (SQLITE_BUSY) (database is locked (code 5): , while compiling: PRAGMA journal_mode)
今天遇到了一个很奇怪的问题,登录完成后,程序会莫名crash, 报了下面的错误: sqlite: Error Code : (SQLITE_BUSY) (database is locked (cod ...
- linux命令(45):去掉 所有文件中的空行
方法一:利用grep grep -v '^\s*$' test.txt 注:-v表示将匹配的结果进行反转,正则表达式匹配空行.(空行可包括空格符制表符等空白字符) 方法二:利用sed sed '/^\ ...
- 整理Lua和Unity和Lua交互文章链接
重点文章: 1.[Unity3D]Unity3D游戏开发之Lua与游戏的不解之缘(上) 2.[Unity3D]Unity3D游戏开发之Lua与游戏的不解之缘(中) 3.Lua和C++交互详细总结 4. ...
- 【Android】Sensor框架Framework层解读
Sensor整体架构 整体架构说明 黄色部分表示硬件,它要挂在I2C总线上 红色部分表示驱动,驱动注册到Kernel的Input Subsystem上,然后通过Event Device把Sensor数 ...
- 【Socket】linux组播技术
1.mystery引入 1)本学期学了计算机网络,对一些网络底层的东西还是不大了解 2)目前IP网络流行3种通信模式,分别是单播/广播与组播 3)根据Internet关于IP地址 ...