【程序练习】——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 ...
随机推荐
- mysql打开binlog
修改mysql的配置文件,ubuntu下mysql的配置文件存放位置为:/etc/mysql/my.cnf 找到log_bin配置项,指定一个路径: 重启数据库:/etc/init.d/mysql r ...
- AliSQL 5.6.32 vs MySQL 5.7.15抢鲜测试
摘要: 今天我们有幸抢鲜测试AliSQL,直接拿来和MySQL 5.7.15对比看看. AliSQL刚宣布开源,我就提交申请内测名额,节前收到开放内测邀请,于是第一时间进行了测试了解,希望能给大 ...
- php分享二十四:数组
1:isset() 对于数组中为 NULL 的值不会返回 TRUE,而 array_key_exists() 会. 2:利用array_filter和strlen快速过滤数组中等于0的值 $path ...
- javaweb下载文件
//读取文件->写出文件 public static void main(String[] args) { InputStream in =null; OutputStream out = nu ...
- MySQL 5.6学习笔记(数据类型)
MySQL支持多种数据类型,主要有数值类型.日期/时间类型和字符串类型. 数值数据类型:包括整数类型TINYINT.SMALLINT.MEDIUMINT.INT.BIGINT.浮点小数类型FLOAT的 ...
- JAVA之堆内存和栈内存的差别
欢迎转载.请附上出处: http://blog.csdn.net/as02446418/article/details/47007975 笔者近期在准备面试的时候又一次看了一些JAVA基础的知识,以下 ...
- 【Unity】10.1 类人动画的导入和设置
分类:Unity.C#.VS2015 创建日期:2016-05-02 一.制作或购买类人模型 为了充分使用 Mecanim 类人动画系统和类人动画的动画重定位功能,需要先使用其他3D建模软件(例如3d ...
- fpm制做mysql-5.6.33 rpm包
增加用户: # groupadd -r mysql # useradd -g mysql -r -s /sbin/nologin -M -d /data/my_db mysql 源码安装mysql-5 ...
- ASP.NET Core2.0 环境下MVC模式的支付宝PC网站支付接口-沙箱环境开发测试
1.新建.NET Core web项目 2.Controllers-Models-Views 分三个大部分 3.下载安装最新sdk 官方的SDK以及Demo都还是.NET Framework的,根据官 ...
- tensorflow笔记5:tensorflow的基本运作,函数
转载:https://blog.csdn.net/lenbow/article/details/52152766 1.tensorflow的基本运作 为了快速的熟悉TensorFlow编程,下面从一段 ...