Metrick

dict

May 7th, 2015
269
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.21 KB | None | 0 0
  1. /*
  2.     Реализация работы со словарями.
  3.     А так же запись и чтение из файла
  4. */
  5.  
  6. #include <iostream>
  7. #include <string>
  8. #include <conio.h>
  9. #include <fstream>
  10.  
  11. using namespace std;
  12.  
  13. typedef unsigned int uint32;  // удобное имя для типа
  14.  
  15. // Структура для хранения ключа и значения определенного элемента словаря
  16. struct tStringDictEntry {
  17.     string key;
  18.     string value;
  19.     tStringDictEntry * next;
  20.     tStringDictEntry(char * k, char * v) : key(k), value(v), next(NULL)
  21.     {};
  22.  
  23.     void operator=(string v) { value = v; }  // перегрузка оператора присвоения (для удобного присвоения по индексу)
  24. };
  25.  
  26. // указатель на эту структуру
  27. typedef tStringDictEntry * pStringDictEntry;
  28.  
  29.  
  30.  
  31. class tStringDict {
  32.     /*
  33.         Класс "словарь" (хранит список ключей-значений)
  34.     */
  35. private:
  36.     pStringDictEntry Data; // Указатель на первый элемент
  37.     uint32 len;  // Длина словаря
  38.  
  39.     pStringDictEntry get_entry(string key);
  40.  
  41. public:
  42.     tStringDict() : Data(NULL) {};
  43.     void set(string key, string value);
  44.     string get(string key, string _default="KEY ERROR");
  45.     string repr();
  46.     bool has_key(string key);
  47.  
  48.     uint32 length() { return len; };
  49.     string * keys();
  50.     string * values();
  51.  
  52.     string operator[](string key) { return get(key); };
  53. };
  54.  
  55.  
  56. class tFileHandler {
  57.     /*
  58.         Класс для сохранения и выгрузки словаря из файла
  59.     */
  60. private:
  61.     string filename;  // имя файла
  62. public:
  63.     tFileHandler(string fname) : filename(fname) {}
  64.     void dump(tStringDict dict);
  65.     tStringDict * load();
  66. };
  67.  
  68.  
  69. void tStringDict::set(string key, string value)
  70. /*
  71.     Установка\замена элемента словаря по ключу
  72. */
  73. {
  74.     if (Data == NULL)
  75.     {
  76.         Data = new tStringDictEntry((char*) key.c_str(), (char*) value.c_str());
  77.         len++;
  78.         return;
  79.     }
  80.  
  81.     pStringDictEntry iterator = Data;
  82.     pStringDictEntry last = NULL;
  83.     while (iterator != NULL)
  84.     {
  85.         if (iterator->key == key)
  86.         {
  87.             iterator->value = value;
  88.             return;
  89.         }
  90.         last = iterator;
  91.         iterator = iterator->next;
  92.     }
  93.     pStringDictEntry new_entry = new tStringDictEntry((char*) key.c_str(), (char*) value.c_str());
  94.     len++;
  95.     last->next = new_entry;
  96. }
  97.  
  98. pStringDictEntry tStringDict::get_entry(string key)
  99. /*
  100.     Получение структуры по ключу (служебный метод)
  101. */
  102. {
  103.     pStringDictEntry iterator = Data;
  104.     while (iterator != NULL)
  105.     {
  106.         if (iterator->key == key)
  107.         {
  108.             return iterator;
  109.         }
  110.         iterator = iterator->next;
  111.     }
  112.    
  113.     return NULL;
  114. }
  115.  
  116. bool tStringDict::has_key(string key)
  117. /*
  118.     Проверяет, существует ли указнный ключ
  119. */
  120. {
  121.     pStringDictEntry entry = get_entry(key);
  122.     return (entry != NULL);
  123. }
  124.  
  125. string tStringDict::get(string key, string _default)
  126. /*
  127.     Получения значения по ключу (в случае если такого нет возвращает _default)
  128. */
  129. {
  130.     if (has_key(key))
  131.         return get_entry(key)->value;
  132.     else
  133.         return _default;
  134. }
  135.  
  136. string * tStringDict::keys()
  137. /*
  138.     Возвращает список всех ключей словаря в виде массива
  139. */
  140. {
  141.     pStringDictEntry iterator = Data;
  142.     string * result = new string[len];
  143.     uint32 cur_index = 0;
  144.     while (iterator != NULL)
  145.     {
  146.         result[cur_index] = iterator->key;
  147.         cur_index++;
  148.         iterator = iterator->next;
  149.     }
  150.     return result;
  151. }
  152.  
  153. string * tStringDict::values()
  154. /*
  155.     Возвращает список всех значений словаря в виде массива
  156. */
  157. {
  158.     pStringDictEntry iterator = Data;
  159.     string * result = new string[len];
  160.     uint32 cur_index = 0;
  161.     while (iterator != NULL)
  162.     {
  163.         result[cur_index] = iterator->value;
  164.         cur_index++;
  165.         iterator = iterator->next;
  166.     }
  167.     return result;
  168. }
  169.  
  170. string tStringDict::repr()
  171. /*
  172.     Выводит текстовое представление словаря
  173. */
  174. {
  175.     pStringDictEntry iterator = Data;
  176.     string result = "{";
  177.     while (iterator != NULL)
  178.     {
  179.         result += "'" + iterator->key + "': '" + iterator->value + "', ";
  180.         iterator = iterator->next;
  181.     }
  182.     result += "}";
  183.     return result;
  184. }
  185.  
  186.  
  187. void tFileHandler::dump(tStringDict dict)
  188. /*
  189.     Функция сохранения словаря в файл
  190. */
  191. {
  192.     ofstream fout(filename);  // открытие файла для записи
  193.     string * keys = dict.keys();  // получаем список всех ключей словаря
  194.     for (uint32 i = 0; i < dict.length(); i++)  // и проходимся по этому списку циклом
  195.     {
  196.  
  197.         string key = keys[i];      // текущий ключ...
  198.         fout << key + "\n";        // ...записываем в файл...
  199.         fout << dict[key] + "\n";  // ...а вслед за ним сразу значение
  200.     }
  201.     fout.close();  // закрываем
  202. }
  203.  
  204.  
  205. tStringDict * tFileHandler::load()
  206. /*
  207.     Функция загрузки словаря из файла
  208. */
  209. {
  210.     tStringDict * result = new tStringDict();  // создаём новый экземпляр для сохранения в памяти
  211.     char buff[50];  // буффер для чтения из файла (не более 50 символов)
  212.     ifstream fin(filename);  // открытие файла для чтения
  213.     while (!fin.eof())  // пока не достигнут конец файла, херачим
  214.     {
  215.         fin.getline(buff, 50);  // считываем четную линию...
  216.         if ((string) buff == "")  // !!! пустые строки говорят так же о конце файла. Заканчиваем в этом случае. !!!
  217.             break;
  218.         string key = buff;          // ... и сохраняем как "ключ", ...
  219.         fin.getline(buff, 50);      // ... считываем нечетную линию ...
  220.         string value = buff;        // ... и сохраняем как "значение" ...
  221.         result->set(key, value);    // устанавливаем новый элемент словарю по этому ключу и значению
  222.     }
  223.     fin.close();  // заканчиваем работу с файлом
  224.     return result;
  225. }
  226.  
  227. void main()
  228. {
  229.     setlocale(LC_ALL, "rus");
  230.  
  231.     tStringDict d = tStringDict();  // определяем словарь (пустой изначально разумеется)
  232.     tFileHandler f = tFileHandler("qweqwe.txt");  // определяем файл куда будем записывать\считывать
  233.    
  234.  
  235.     // установка разнообразных полей для словаря
  236.     d.set("cat", "кошка");
  237.     d.set("dog", "собака");
  238.     d.set("elephant", "слон");
  239.     d.set("penguin", "пингвин");
  240.     d.set("Vasya", "Вася");
  241.     d.set("Crow", "Ворон");
  242.  
  243.     f.dump(d);
  244.  
  245.     // ---------------------------------------------------
  246.  
  247.     tStringDict * q;  // определяем указатель на будущий словарь
  248.     q = f.load();  // получаем указатель на новый словарь из load
  249.     cout << q->repr();  // выводим строкове представления для просмотра
  250.  
  251.     _getch();
  252. }
Advertisement
Add Comment
Please, Sign In to add comment