深入理解STL容器与文件解析

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

它具有以下特点:

  • 可以在树中存储无限长度的字符串作为注释。
  • 为不同数据类型存储和检索值提供了重载函数,即只需一个函数调用即可检索整数、浮点值或字符串列表。
  • 内置了良好的错误校正功能。
  • 由于使用了STL的文件流和所有用于它的函数都来自标准C++库,因此它是平台独立的。
  • 它是开源的,没有任何附加条件,可以修改、删除、移除、添加、替换、转储、拒绝它,甚至可以声称它是。

对于用户来说,它的工作原理如下:

  1. 首先创建一个解析器类的对象:
  2. parser p;
  3. 向其中添加变量:
    1. 首先添加一个部分:
    2. p.add("window_position");
    3. 向其中添加变量:
    4. p.add("window_position", "top", 50);
  4. 如果使用以下行,将返回错误,因为该部分不存在:
  5. p.add("long_section", "long_val", 1232323);
  6. 正确的方法是:
  7. p.add("long_section"); p.add("long_section", "long_val", 1232323);
  8. 要从中获取变量,可以先检查部分是否存在:
  9. if(p.get("section")) p.get("section", "long_val", lVar);
  10. 要删除一个部分:
  11. p.del("section");
  12. 要删除一个变量:
  13. p.del("section", "variable_name");
  14. 要删除所有内容:
  15. p.del_all();
  16. 要更改一个值:
  17. p.set("section", "variable_name", new_value);
  18. 要添加注释字符串:
  19. p.add_comment("infinite long string"); or p.add_comment("string", iPos);
  20. 要获取注释字符串:
  21. char szBuffer[iEnoughSpace]; p.get_comment(szBuffer, iPos);
  22. 要删除注释字符串:
  23. p.del_comment(iPos);
  24. 要从文件中解析:
  25. p.get_file_en_parse("file_path");
  26. 如果解析过程中出现错误,将返回错误。
  27. 要将DOM树保存到文件中:
  28. 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上的第一篇文章……

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485