Abstract
寫文字檔轉檔程式是很常見的需求,一般來說,這種都屬於dirty job,沒什麼技巧,純粹是迴圈硬幹,若使用STL來寫轉檔程式,不只程式超短,一個迴圈都不需要!!

Introduction
昨天網友Momo要我幫他寫一個轉檔程式,將文字檔轉成XML檔,格式如下

文字檔user_b5fix.dat

-1,-1,-1,-1,-1,-1
一元運算符,一元運算子
二叉樹,二元樹
二元運算符,二元運算子
二分查找,二分搜尋法
二進制,二進位
二極管,二極體
人工智能,人工智慧
人工過濾,手動過濾
八進制的,八進位的

XML檔tongwen.xml

<?xml version="1.0" encoding="UTF-8"?>
<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

1/**//* 
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行

ifstream inFile("user_b5fix.dat");
ofstream outFile("tongwen.xml");

宣告欲讀入的文字user_b5fix.dat和欲輸出的文字檔tongwen.xml。

24行

vector<string> svec;

宣告一個vector。

25行

copy(istream_iterator<string>(inFile), istream_iterator<string>(), back_inserter(svec));

將文字檔讀入vector,使用了copy()這個泛型演算法,第一個參數傳入文字檔的開始位置,第二個參數傳入文字檔的結束位置,如此copy()就能從頭到尾的讀取文字檔,第三個參數是將讀進的資料寫到vector。為什麼要用back_inserter()呢?因為我們希望資料是一筆一筆採用附加的方式寫入vector。

26行

remove(svec.begin(), svec.end(), "-1,-1,-1,-1,-1,-1");

這一行算是dirty job,因為原來的user_b5fix.dat文字檔中,第一行是-1,-1,-1,-1,-1,-1這些垃圾資料,所以必須先刪除之,使用了remove()泛型演算法。

27行

transform(svec.begin(), svec.end(), svec.begin(), op);

轉檔工作正式開始,使用了transform()泛型演算法,一般來說transform()是用來將a容器轉換到b容器使用,但由於現在來源和目的是同一個容器,所以第一個參數和第三個參數一樣。

該如何轉換呢?我們必須將規則告訴transform(),第四個參數op是我們另外寫的function,這個參數可以是一般global function,或者是function object(functor)。

16行

string op(string& s) {
  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行

outFile << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" << endl << "<manifest>" << endl << "<traditional>" << endl;

處理XML檔頭所需的字串,在C++裡,不只cin、cout可以使用<<喔,檔案也可以。

32行

copy(svec.begin(), svec.end(),  ostream_iterator<string>(outFile, "\n"));

將轉好的vector資料copy到XML檔。

33行

outFile << "</traditional>" << endl << "<simplified>" << endl << endl << "</simplified>" << endl << "</manifest>";

處理XML檔檔尾字串。

35行

inFile.close();
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)相关推荐

  1. 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 ...

  2. eclipes创建一个web项目web.xml不能自动更新的原因(web.xml和@WebServlet的作用)

    在eclipse中创建一个Web项目的时候,虽然有web.xml生成,但是再添加Servlet类文件的时候总是看不见web.xml的更新,所以异常的郁闷!上网查了查,原来我们在创建Web项目的时候,会 ...

  3. Java web之web.xml配置详解

    什么是web.xml web.xml是web项目的配置文件,一般的web工程都会用到web.xml来配置,方便大型开发.web.xml主要用来配置Filter,Listener,Servlet等.但是 ...

  4. web.xml 常用标签配置(转)

    2019独角兽企业重金招聘Python工程师标准>>> 1.Web.xml作用: 每一个javaWeb工程都有一个web.xml配置文件,web.xml文件是用来初始化工程配置信息的 ...

  5. html页面配置xml文件路径,web.xml与index.html

    一.部署描述符 1.每个web应用程序的配置信息都保存在各自所映射的文件系统目录下的Web-INF/web.xml文件中.web.xml文件用于描述web应用程序的部署信息,因此, web.xml文件 ...

  6. Stuts的Web.xml 详解

    1 定义头和根元素 部署描述符文件就像所有XML文件一样,必须以一个XML头开始.这个头声明可以使用的XML版本并给出文件的字符编码. DOCYTPE声明必须立即出现在此头之后.这个声明告诉服务器适用 ...

  7. Jsp在Web.xml中的配置

    以下列出web.xml经常使用的标签元素及这些标签元素的功能: 1.指定欢迎页面.比如: <welcome-file-list> <welcome-file-list> < ...

  8. eclipse mysql Xml配置_mysql8.0在eclipse中通过xml文件配置数据库连接池

    mysql8.0在eclipse中通过xml文件配置数据库连接池 1.关于Mysql8.0 2.数据库连接池(DBCP) 3.准备工作 4.配置context.xml 5.配置web.xml 6.调用 ...

  9. web项目中的web.xml元素解析

    2019独角兽企业重金招聘Python工程师标准>>> 1 定义头和根元素 部署描述符文件就像所有XML文件一样,必须以一个XML头开始.这个头声明可以使用的XML版本并给出文件的字 ...

  10. Eclipse自动注册Servlet:web.xml注册和@Servlet注解 实现注册

    在创建Javaweb项目中要会用到大量的Servlet类,若一一手动注册会很繁琐,此时我们就得想办法实现web.xml自动注册了. Servlet自动注册的两种方法: 1.web.xml自动注册 2. ...

最新文章

  1. 负载均衡策略深入剖析
  2. 计算机高职考理论知识,考计算机基础知识理论试题
  3. 上班之第一个无聊周末
  4. Oracle_spatial的函数介绍
  5. 黑鲨4S磁动力升降肩键将全面升级:颜值和按压手感稳步提升
  6. 已从事软件测试一年,感觉依然很菜,只会基础的功能测试,想进一步学习,有没有好的建议呢?
  7. POI以SAX方式解析Excel2007大文件(包含空单元格的处理)
  8. 【图像融合】基于matlab PCA图像融合【含Matlab源码 723期】
  9. android手机密码忘了哪个电话打开,如果手机锁屏密码忘记了怎么办_安卓手机锁屏密码忘了的处理办法-系统城...
  10. 关于计算机分类 按用途可以分为,计算机的分类一般分为
  11. 【NOIP模拟】夕阳
  12. linux更改ntfs格式权限,Gentoo Linux下读写NTFS格式分区(ntfs-3g解决NTFS只读不可写的问题)...
  13. 网站安全测试-安全性缺陷
  14. “先进”的飞书为何搞不定钉钉?
  15. 帝国cms tag生成html,帝国CMS TAG标签伪静态化
  16. 如何设置Sketch快捷键,Sketch提升效率的常用技巧
  17. python27是什么文件夹可以删除吗_python如何跳过错误继续运行,同时删除产生错误的文档...
  18. 斩获技术向善奖,云开发上榜 2020 中国技术品牌影响力企业
  19. 计算机系统中用通常所说的外存是指,全国计算机一级考试选择题练习及答案(2)...
  20. 系统分析员论文(二)------某电子支付系统分析论文

热门文章

  1. 在Python中从头开始模拟退火
  2. python解决sip与ptqt不兼容导致页面截图引擎无法运行问题
  3. machine learning之PCA、ICA
  4. 神经网络入门之CNN(二)
  5. php 什么函数获取ip,php函数获取在线ip与客户端ip
  6. 关于Jedis和lettuce以及springDataRedis的一些区别
  7. mysql遵循acid_关系型数据库遵循ACID规则
  8. java 有界泛型_JAVA泛型中的有界类型(extends super)
  9. Android--UI控件
  10. java中常用的类——Object类