Properties --- C++讀配置資訊的類(一)
在開發實踐中,積累了一些通用的C++ 類庫,在此寫出來給大家分享。也希望能給出更好的建議。工具庫的名字是xtl——Properties 類。分兩部分介紹。這篇介紹類的定義。下一篇將介紹類的實現。 。這篇介紹其中的讀配置檔案的類
下面是類的定義的標頭檔案:
1
2 /*xtl/Properties.h
3 Author: ZhangTao
4 Date: Nov 6, 2008
5 */
6
7 # ifndef Properties_h
8 # define Properties_h
9
10 # include <algorithm>
11 # include <iterator>
12
13 # include <iostream>
14 # include <string>
15 # include <map>
16
17 namespace std {
18 // <map> member output operator
19 template<typename _U, typename _V>
20 ostream& operator<< (ostream& os, const pair<_U, _V>& val) {
21 return os << val.first << " = " << val.second;
22 }
23
24 // <map> output operator, ie. all members in <map> output to <ostream>
25 template<typename _U, typename _V>
26 ostream& operator<< (ostream& os, const map<_U, _V>& val) {
27 copy(val.begin(), val.end(), ostream_iterator< pair<_U, _V> >(os, "/n"));
28 return os;
29 }
30 } // end of <namespace std>
31
32 namespace xtl {
33
34 class Properties : public std::map<std::string, std::string> {
35 public:
36 Properties() {};
37 Properties(const char* fname, const char* section = "") {
38 load(fname, section);
39 }
40 Properties(std::istream& is, const char* section = "") {
41 load(is, section);
42 }
43
44 void load(const char* fname, const char* section = "");
45 void load(std::istream& is, const char* section = "");
46 void loadXML(const char* fname, const char* section = "");
47 void loadXML(std::istream& is, const char* section = "");
48
49 const std::string& getProperty(const std::string& key) const;
50
51 void list(std::ostream& os) const {
52 os << *this;
53 }
54 }; // end of <class Properties>
55
56 const char* const XML_ENTRY = "entry";
57 const char* const XML_KEY = "key";
58
59 } // end of <namespace xtl>
60
61 # endif /* end of <ifndef Properties_h> */
62
Properties 繼承了stl 庫的map 容器類。這樣可以使用map 的各個介面實現。尤其是輸出輸入的過載的實現。
18 到22 行定義了map 單個元素的輸出過載;25 到29 行則定義了map 全部元素的輸出過載。正是有了這些鋪墊,才使得51 行的list 函式顯得那麼簡練。實際上list 函式完全可以不需要,可以使用<< 過載輸出。例如:
Properties prop;
cout << prop;
等同於:
prop.list(cout);
Properties 的load 是用於從檔案中讀入資料的。它可以讀入下面格式的檔案:
# props.conf
# for Properties class test
TEST1=TEST1VALUE
TEST2=TEST2VALUE
TEST3=TEST3VALUE
TEST4 = 100
[Section0]
TEST01=TEST01VALUE
TEST02=TEST02VALUE
TEST03=TEST03VALUE
TEST04 = 200
[Section1]
TEST11=TEST11VALUE
TEST12=TEST12VALUE
TEST13=TEST13VALUE
TEST14 = 300
下面是測試程式:
/* tst-properties
test class Properties
*/
# include "xtl/Properties.h"
int
main(int argc, char* argv[])
{
const char* sec;
if ( argc > 1 )
sec = argv[1];
else
sec = "";
xtl::Properties prop(std::cin, sec);
prop.list(std::cout);
if ( argc > 2 )
std::cout << "Key:<" << argv[2] << "> Value:" <<
prop.getProperty(argv[2]) << "/n";
return 0;
}
上面的測試資料檔案為 props.conf ,測試程式編譯連線後的執行檔案為 tst-properties 。
以下是執行結果。
$ tst-properties <props.conf
TEST1 = TEST1VALUE
TEST2 = TEST2VALUE
TEST3 = TEST3VALUE
TEST4 = 100
$ tst-properties Section0 ITEM04 <props.conf
TEST01 = TEST01VALUE
TEST02 = TEST02VALUE
TEST03 = TEST03VALUE
TEST04 = 200
Key:<TEST04> Value:200
由於繼承了map類,相應的操作異常簡練。最複雜的應該是load函數了。
load的實現,請閱下一篇文章。