inifile.h 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. #ifndef _INIFILE_H
  2. #define _INIFILE_H
  3. #include <map>
  4. #include <vector>
  5. #include <string>
  6. #include <string.h>
  7. using namespace std;
  8. namespace inifile
  9. {
  10. const int RET_OK = 0;
  11. const int RET_ERR = -1;
  12. const string delim = "\n";
  13. struct IniItem {
  14. string key;
  15. string value;
  16. string comment;
  17. };
  18. struct IniSection {
  19. typedef vector<IniItem>::iterator iterator;
  20. iterator begin() {
  21. return items.begin();
  22. }
  23. iterator end() {
  24. return items.end();
  25. }
  26. string name;
  27. string comment;
  28. vector<IniItem> items;
  29. };
  30. class IniFile
  31. {
  32. public:
  33. IniFile();
  34. ~IniFile() {
  35. release();
  36. }
  37. public:
  38. typedef map<string, IniSection *>::iterator iterator;
  39. iterator begin() {
  40. return sections_.begin();
  41. }
  42. iterator end() {
  43. return sections_.end();
  44. }
  45. public:
  46. /* 打开并解析一个名为fname的INI文件 */
  47. int load(const string &fname);
  48. /*将内容保存到当前文件*/
  49. int save();
  50. /*将内容另存到一个名为fname的文件*/
  51. int saveas(const string &fname);
  52. /*获取section段第一个键为key的值,并返回其string型的值*/
  53. string getStringValue(const string &section, const string &key, int &ret);
  54. /*获取section段第一个键为key的值,并返回其int型的值*/
  55. int getIntValue(const string &section, const string &key, int &ret);
  56. /*获取section段第一个键为key的值,并返回其double型的值*/
  57. double getDoubleValue(const string &section, const string &key, int &ret);
  58. /*获取section段第一个键为key的值,并将值赋到value中*/
  59. int getValue(const string &section, const string &key, string &value);
  60. /*获取section段第一个键为key的值,并将值赋到value中,将注释赋到comment中*/
  61. int getValue(const string &section, const string &key, string &value, string &comment);
  62. /*获取section段所有键为key的值,并将值赋到values的vector中*/
  63. int getValues(const string &section, const string &key, vector<string> &values);
  64. /*获取section段所有键为key的值,并将值赋到values的vector中,,将注释赋到comments的vector中*/
  65. int getValues(const string &section, const string &key, vector<string> &value, vector<string> &comments);
  66. bool hasSection(const string &section) ;
  67. bool hasKey(const string &section, const string &key) ;
  68. /* 获取section段的注释 */
  69. int getSectionComment(const string &section, string &comment);
  70. /* 设置section段的注释 */
  71. int setSectionComment(const string &section, const string &comment);
  72. /*获取注释标记符列表*/
  73. void getCommentFlags(vector<string> &flags);
  74. /*设置注释标记符列表*/
  75. void setCommentFlags(const vector<string> &flags);
  76. /*同时设置值和注释*/
  77. int setValue(const string &section, const string &key, const string &value, const string &comment = "");
  78. /*删除段*/
  79. void deleteSection(const string &section);
  80. /*删除特定段的特定参数*/
  81. void deleteKey(const string &section, const string &key);
  82. public:
  83. /*去掉str后面的c字符*/
  84. static void trimleft(string &str, char c = ' ');
  85. /*去掉str前面的c字符*/
  86. static void trimright(string &str, char c = ' ');
  87. /*去掉str前面和后面的空格符,Tab符等空白符*/
  88. static void trim(string &str);
  89. /*将字符串str按分割符delim分割成多个子串*/
  90. private:
  91. IniSection *getSection(const string &section = "");
  92. void release();
  93. int getline(string &str, FILE *fp);
  94. bool isComment(const string &str);
  95. bool parse(const string &content, string &key, string &value, char c = '=');
  96. //for dubug
  97. void print();
  98. private:
  99. map<string, IniSection *> sections_;
  100. string fname_;
  101. vector<string> flags_;
  102. };
  103. }
  104. #endif