STL(标准模板库)为动态存储对象提供了丰富的容器集合。基于此构建的代码具有平台独立性。两年前,开始学习STL并编写了一些代码,最终形成了一个用于存储设置的脚本方案,类似于.ini文件。虽然代码可能不是完美的,但确保它能够无错误地运行。它不仅在VC 6、7.0上运行良好,而且可能在VC 7.1、Intel、Borland 5.5、Borland Builder、MinGW端口的GCC、GCC、Digital Mars等众多编译器上运行。
它展示了如何构建一个独特的DOM模型来解析文本文件。这是一个具有三层存储的树状结构。生成的文本文件如下所示:
This is a typical scripting scheme by which the DOM tree is saved to a file.
This is the database file used by the color C++ dialog box. Don't edit this. This is highly configurable and replaces the ini and registry system of Windows. For more information see about.
«color»-------------------------------------------------------------------
264754
792892
1321030
1849168
2377306
2905444
3433582
3961720
4489858
5017996
5546134
6074272
6602410
7130548
7658686
8186824
0
«Button»-------------------------------------------------------------------
107
«Always-on-top»-------------------------------------------------------------
0
«Window-Placement»----------------------------------------------------------
-1
-1
-1
-1
490
196
690
378
它具有以下特点:
对于用户来说,它的工作原理如下:
parser p;
p.add("window_position");
p.add("window_position", "top", 50);
p.add("long_section", "long_val", 1232323);
p.add("long_section");
p.add("long_section", "long_val", 1232323);
if(p.get("section"))
p.get("section", "long_val", lVar);
p.del("section");
p.del("section", "variable_name");
p.del_all();
p.set("section", "variable_name", new_value);
p.add_comment("infinite long string");
or
p.add_comment("string", iPos);
char szBuffer[iEnoughSpace];
p.get_comment(szBuffer, iPos);
p.del_comment(iPos);
p.get_file_en_parse("file_path");
p.get_all_en_save("file_path");
实际上,甚至可以通过将对象转换为(char*)并追加一个0来添加对象。
它的内部工作原理如下:
它使用了三种类型的对象。第一种对象存储值名称和值(类vh),第二种对象存储第一种对象和注释字符串(类section),第三种对象存储第二种对象和其他函数(类mParse)。其他类和成员是自解释的。
mParse类:
class mParse {
private:
list> root;
section _section;
HANDLE hFile;
char *fname;
unsigned char *buffer;
DWORD dwBufferSize;
bool condense_to_buffer(void);
bool open_file(void);
bool free_buffer(void);
bool phrase_from_file(void);
public:
mParse();
bool get_file_en_parse(char *szFname);
bool get_all_en_save(char *szFname);
bool add(char *szSection, char *szName, char *szValue);
bool add(char *szSection, char *szName, bool bValue);
bool add(char *szSection, char *szName, int iVlaue);
bool add(char *szSection, char *szName, long lValue);
bool add(char *szSection, char *szName, float fValue);
bool add(char *szSection, char *szName, double dValue);
bool add(char *szSection, char *szName, DWORD dwValue);
bool add(char *szSection);
bool del(char *szSection);
bool del(char *szSection, char *szName);
bool del_all(char *szSection, char *szName);
bool get(char *szSection);
bool get(char *szSection, char *szName, char *szReturnValue);
bool get(char *szSection, char *szName, bool &bReturnValue);
bool get(char *szSection, char *szName, int &iReturnValue);
bool get(char *szSection, char *szName, long &lReturnValue);
bool get(char *szSection, char *szName, float &fReturnValue);
bool get(char *szSection, char *szName, double &dReturnValue);
bool get(char *szSection, char *szName, DWORD &dwReturnValue);
bool get(char *szSection, char *szName, char *szReturnValue, int iValuNo);
bool set(char *szSection, char *szName, char *szValue);
bool set(char *szSection, char *szName, bool bValue);
bool set(char *szSection, char *szName, int iValue);
bool set(char *szSection, char *szName, long lValue);
bool set(char *szSection, char *szName, float fValue);
bool set(char *szSection, char *szName, double dValue);
bool set(char *szSection, char *szName, DWORD dwValue);
bool set(char *szSection, char *szName, char *szValue, int iValuNo);
bool add_binary(char *szSection, char *szName, void *data, long data_size);
bool get_binary(char *szSection, char *szName, void *data, long data_size);
bool set_binary(char *szSection, char *szName, void *data, long data_size);
bool del_binary(char *szSection, char *szNames);
void add_comment(char *szComment);
void add_comment(char *szComment, int iInsertPos);
bool get_comment(char *szReturnValue, int iCommentNo);
bool replace_comment(char *szReplaceString, int iCommentNo);
bool del_comment(int iCommentNo);
void del_all(void);
};
免责声明:
这只是一个演示,它可能不适合特定的要求,也不一定适合用于程序中。
历史:
这是一个两年前编写的小程序。它可能包含错误,也可能没有有效地使用STL容器。如果写作和程序中有任何错误,表示遗憾。
这是在CodeProject上的第一篇文章……