如何使用STL寫XML轉檔程式? (C/C++) (STL) (Web) (XML)
Abstract
寫文字檔轉檔程式是很常見的需求,一般來說,這種都屬於dirty job,沒什麼技巧,純粹是迴圈硬幹,若使用STL來寫轉檔程式,不只程式超短,一個迴圈都不需要!!
Introduction
昨天網友Momo要我幫他寫一個轉檔程式,將文字檔轉成XML檔,格式如下
文字檔user_b5fix.dat
一元運算符,一元運算子
二叉樹,二元樹
二元運算符,二元運算子
二分查找,二分搜尋法
二進制,二進位
二極管,二極體
人工智能,人工智慧
人工過濾,手動過濾
八進制的,八進位的
XML檔tongwen.xml
<manifest>
<traditional>
<phrase><s>数据</s><r>資料</r></phrase>
<phrase><s>台湾</s><r>台灣</r></phrase>
</traditional>
<simplified>
</simplified>
</manifest>
user_b5fix.dat是個純文字檔,記載著繁體中文和簡體中文的對照表,實際上檔案有三千多筆資料,因為篇幅的關係,我只列出前幾行,希望轉成XML檔後,在<s></s>內放簡體中文,在<r></r>內放繁體中文。
txt_to_xml.cpp
2(C) OOMusou 2007 http://oomusou.cnblogs.com
3
4Filename : txt_to_xml.cpp
5Compiler : Visual C++ 8.0
6Description : Demo how to transform text to xml
7Release : 01/30/2007 1.1
8*/
9#include <fstream>
10#include <vector>
11#include <string>
12#include <algorithm>
13
14using namespace std;
15
16string op(string& s) {
17 s.replace(s.find(","), 1, "</s><r>");
18 return "<phrase><s>" + s + "</r></phrase>";
19}
20
21int main() {
22 ifstream inFile("user_b5fix.dat");
23 ofstream outFile("tongwen.xml");
24
25 vector<string> svec;
26 copy(istream_iterator<string>(inFile), istream_iterator<string>(), back_inserter(svec));
27 remove(svec.begin(), svec.end(), "-1,-1,-1,-1,-1,-1");
28
29 transform(svec.begin(), svec.end(), svec.begin(), op);
30
31 outFile << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" << endl << "<manifest>" << endl << "<traditional>" << endl;
32 copy(svec.begin(), svec.end(), ostream_iterator<string>(outFile, "\n"));
33 outFile << "</traditional>" << endl << "<simplified>" << endl << endl << "</simplified>" << endl << "</manifest>";
34
35 inFile.close();
36 outFile.close();
37}
整個轉檔的程式的想法是:將文字檔讀進vector後,在vector內作轉檔工作,最後再輸出到XML檔。
21行、22行
ofstream outFile("tongwen.xml");
宣告欲讀入的文字user_b5fix.dat和欲輸出的文字檔tongwen.xml。
24行
宣告一個vector。
25行
將文字檔讀入vector,使用了copy()這個泛型演算法,第一個參數傳入文字檔的開始位置,第二個參數傳入文字檔的結束位置,如此copy()就能從頭到尾的讀取文字檔,第三個參數是將讀進的資料寫到vector。為什麼要用back_inserter()呢?因為我們希望資料是一筆一筆採用附加的方式寫入vector。
26行
這一行算是dirty job,因為原來的user_b5fix.dat文字檔中,第一行是-1,-1,-1,-1,-1,-1這些垃圾資料,所以必須先刪除之,使用了remove()泛型演算法。
27行
轉檔工作正式開始,使用了transform()泛型演算法,一般來說transform()是用來將a容器轉換到b容器使用,但由於現在來源和目的是同一個容器,所以第一個參數和第三個參數一樣。
該如何轉換呢?我們必須將規則告訴transform(),第四個參數op是我們另外寫的function,這個參數可以是一般global function,或者是function object(functor)。
16行
s.replace(s.find(","), 1, "</s><r>");
return "<phrase><s>" + s + "</r></phrase>";
}
就是我們自己寫的global function,首先將","替換成</s><r>,然後在每行前後加上XML tag。
或許你會覺得transform()為了轉換規則,還需另開一個global function很麻煩,在boost和C# 3.0的lambda就是為了解決這個問題,可以直接將轉換規則透過lambda寫在transform()裡。
31行
處理XML檔頭所需的字串,在C++裡,不只cin、cout可以使用<<喔,檔案也可以。
32行
將轉好的vector資料copy到XML檔。
33行
處理XML檔檔尾字串。
35行
outFile.close();
對兩個檔案進行關檔動作。
Conclusion
本來發下豪語要在20行內寫出來,結果現在扣掉註解,還需26行,哈。若使用boost的lambda還可以再省掉三行,不過最少全部使用STL解決,和我預期的目標接近。
若是C#和Java coder看到這種程式碼應該相當震驚,回想我第一次看到STL時那種驚訝的表情,竟然完全沒用到一行迴圈!!這正是STL優雅之處。
转载于:https://www.cnblogs.com/lzjsky/archive/2010/10/26/1861814.html
如何使用STL寫XML轉檔程式? (C/C++) (STL) (Web) (XML)相关推荐
- Parse error in application web.xml file at jndi:/localhost/ipws/WEB-INF/web.xml
严重: Parse error in application web.xml file at jndi:/localhost/ipws/WEB-INF/web.xml java.lang.NoSuch ...
- eclipes创建一个web项目web.xml不能自动更新的原因(web.xml和@WebServlet的作用)
在eclipse中创建一个Web项目的时候,虽然有web.xml生成,但是再添加Servlet类文件的时候总是看不见web.xml的更新,所以异常的郁闷!上网查了查,原来我们在创建Web项目的时候,会 ...
- Java web之web.xml配置详解
什么是web.xml web.xml是web项目的配置文件,一般的web工程都会用到web.xml来配置,方便大型开发.web.xml主要用来配置Filter,Listener,Servlet等.但是 ...
- web.xml 常用标签配置(转)
2019独角兽企业重金招聘Python工程师标准>>> 1.Web.xml作用: 每一个javaWeb工程都有一个web.xml配置文件,web.xml文件是用来初始化工程配置信息的 ...
- html页面配置xml文件路径,web.xml与index.html
一.部署描述符 1.每个web应用程序的配置信息都保存在各自所映射的文件系统目录下的Web-INF/web.xml文件中.web.xml文件用于描述web应用程序的部署信息,因此, web.xml文件 ...
- Stuts的Web.xml 详解
1 定义头和根元素 部署描述符文件就像所有XML文件一样,必须以一个XML头开始.这个头声明可以使用的XML版本并给出文件的字符编码. DOCYTPE声明必须立即出现在此头之后.这个声明告诉服务器适用 ...
- Jsp在Web.xml中的配置
以下列出web.xml经常使用的标签元素及这些标签元素的功能: 1.指定欢迎页面.比如: <welcome-file-list> <welcome-file-list> < ...
- eclipse mysql Xml配置_mysql8.0在eclipse中通过xml文件配置数据库连接池
mysql8.0在eclipse中通过xml文件配置数据库连接池 1.关于Mysql8.0 2.数据库连接池(DBCP) 3.准备工作 4.配置context.xml 5.配置web.xml 6.调用 ...
- web项目中的web.xml元素解析
2019独角兽企业重金招聘Python工程师标准>>> 1 定义头和根元素 部署描述符文件就像所有XML文件一样,必须以一个XML头开始.这个头声明可以使用的XML版本并给出文件的字 ...
- Eclipse自动注册Servlet:web.xml注册和@Servlet注解 实现注册
在创建Javaweb项目中要会用到大量的Servlet类,若一一手动注册会很繁琐,此时我们就得想办法实现web.xml自动注册了. Servlet自动注册的两种方法: 1.web.xml自动注册 2. ...
最新文章
- 负载均衡策略深入剖析
- 计算机高职考理论知识,考计算机基础知识理论试题
- 上班之第一个无聊周末
- Oracle_spatial的函数介绍
- 黑鲨4S磁动力升降肩键将全面升级:颜值和按压手感稳步提升
- 已从事软件测试一年,感觉依然很菜,只会基础的功能测试,想进一步学习,有没有好的建议呢?
- POI以SAX方式解析Excel2007大文件(包含空单元格的处理)
- 【图像融合】基于matlab PCA图像融合【含Matlab源码 723期】
- android手机密码忘了哪个电话打开,如果手机锁屏密码忘记了怎么办_安卓手机锁屏密码忘了的处理办法-系统城...
- 关于计算机分类 按用途可以分为,计算机的分类一般分为
- 【NOIP模拟】夕阳
- linux更改ntfs格式权限,Gentoo Linux下读写NTFS格式分区(ntfs-3g解决NTFS只读不可写的问题)...
- 网站安全测试-安全性缺陷
- “先进”的飞书为何搞不定钉钉?
- 帝国cms tag生成html,帝国CMS TAG标签伪静态化
- 如何设置Sketch快捷键,Sketch提升效率的常用技巧
- python27是什么文件夹可以删除吗_python如何跳过错误继续运行,同时删除产生错误的文档...
- 斩获技术向善奖,云开发上榜 2020 中国技术品牌影响力企业
- 计算机系统中用通常所说的外存是指,全国计算机一级考试选择题练习及答案(2)...
- 系统分析员论文(二)------某电子支付系统分析论文