Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Реализация работы со словарями.
- А так же запись и чтение из файла
- */
- #include <iostream>
- #include <string>
- #include <conio.h>
- #include <fstream>
- using namespace std;
- typedef unsigned int uint32; // удобное имя для типа
- // Структура для хранения ключа и значения определенного элемента словаря
- struct tStringDictEntry {
- string key;
- string value;
- tStringDictEntry * next;
- tStringDictEntry(char * k, char * v) : key(k), value(v), next(NULL)
- {};
- void operator=(string v) { value = v; } // перегрузка оператора присвоения (для удобного присвоения по индексу)
- };
- // указатель на эту структуру
- typedef tStringDictEntry * pStringDictEntry;
- class tStringDict {
- /*
- Класс "словарь" (хранит список ключей-значений)
- */
- private:
- pStringDictEntry Data; // Указатель на первый элемент
- uint32 len; // Длина словаря
- pStringDictEntry get_entry(string key);
- public:
- tStringDict() : Data(NULL) {};
- void set(string key, string value);
- string get(string key, string _default="KEY ERROR");
- string repr();
- bool has_key(string key);
- uint32 length() { return len; };
- string * keys();
- string * values();
- string operator[](string key) { return get(key); };
- };
- class tFileHandler {
- /*
- Класс для сохранения и выгрузки словаря из файла
- */
- private:
- string filename; // имя файла
- public:
- tFileHandler(string fname) : filename(fname) {}
- void dump(tStringDict dict);
- tStringDict * load();
- };
- void tStringDict::set(string key, string value)
- /*
- Установка\замена элемента словаря по ключу
- */
- {
- if (Data == NULL)
- {
- Data = new tStringDictEntry((char*) key.c_str(), (char*) value.c_str());
- len++;
- return;
- }
- pStringDictEntry iterator = Data;
- pStringDictEntry last = NULL;
- while (iterator != NULL)
- {
- if (iterator->key == key)
- {
- iterator->value = value;
- return;
- }
- last = iterator;
- iterator = iterator->next;
- }
- pStringDictEntry new_entry = new tStringDictEntry((char*) key.c_str(), (char*) value.c_str());
- len++;
- last->next = new_entry;
- }
- pStringDictEntry tStringDict::get_entry(string key)
- /*
- Получение структуры по ключу (служебный метод)
- */
- {
- pStringDictEntry iterator = Data;
- while (iterator != NULL)
- {
- if (iterator->key == key)
- {
- return iterator;
- }
- iterator = iterator->next;
- }
- return NULL;
- }
- bool tStringDict::has_key(string key)
- /*
- Проверяет, существует ли указнный ключ
- */
- {
- pStringDictEntry entry = get_entry(key);
- return (entry != NULL);
- }
- string tStringDict::get(string key, string _default)
- /*
- Получения значения по ключу (в случае если такого нет возвращает _default)
- */
- {
- if (has_key(key))
- return get_entry(key)->value;
- else
- return _default;
- }
- string * tStringDict::keys()
- /*
- Возвращает список всех ключей словаря в виде массива
- */
- {
- pStringDictEntry iterator = Data;
- string * result = new string[len];
- uint32 cur_index = 0;
- while (iterator != NULL)
- {
- result[cur_index] = iterator->key;
- cur_index++;
- iterator = iterator->next;
- }
- return result;
- }
- string * tStringDict::values()
- /*
- Возвращает список всех значений словаря в виде массива
- */
- {
- pStringDictEntry iterator = Data;
- string * result = new string[len];
- uint32 cur_index = 0;
- while (iterator != NULL)
- {
- result[cur_index] = iterator->value;
- cur_index++;
- iterator = iterator->next;
- }
- return result;
- }
- string tStringDict::repr()
- /*
- Выводит текстовое представление словаря
- */
- {
- pStringDictEntry iterator = Data;
- string result = "{";
- while (iterator != NULL)
- {
- result += "'" + iterator->key + "': '" + iterator->value + "', ";
- iterator = iterator->next;
- }
- result += "}";
- return result;
- }
- void tFileHandler::dump(tStringDict dict)
- /*
- Функция сохранения словаря в файл
- */
- {
- ofstream fout(filename); // открытие файла для записи
- string * keys = dict.keys(); // получаем список всех ключей словаря
- for (uint32 i = 0; i < dict.length(); i++) // и проходимся по этому списку циклом
- {
- string key = keys[i]; // текущий ключ...
- fout << key + "\n"; // ...записываем в файл...
- fout << dict[key] + "\n"; // ...а вслед за ним сразу значение
- }
- fout.close(); // закрываем
- }
- tStringDict * tFileHandler::load()
- /*
- Функция загрузки словаря из файла
- */
- {
- tStringDict * result = new tStringDict(); // создаём новый экземпляр для сохранения в памяти
- char buff[50]; // буффер для чтения из файла (не более 50 символов)
- ifstream fin(filename); // открытие файла для чтения
- while (!fin.eof()) // пока не достигнут конец файла, херачим
- {
- fin.getline(buff, 50); // считываем четную линию...
- if ((string) buff == "") // !!! пустые строки говорят так же о конце файла. Заканчиваем в этом случае. !!!
- break;
- string key = buff; // ... и сохраняем как "ключ", ...
- fin.getline(buff, 50); // ... считываем нечетную линию ...
- string value = buff; // ... и сохраняем как "значение" ...
- result->set(key, value); // устанавливаем новый элемент словарю по этому ключу и значению
- }
- fin.close(); // заканчиваем работу с файлом
- return result;
- }
- void main()
- {
- setlocale(LC_ALL, "rus");
- tStringDict d = tStringDict(); // определяем словарь (пустой изначально разумеется)
- tFileHandler f = tFileHandler("qweqwe.txt"); // определяем файл куда будем записывать\считывать
- // установка разнообразных полей для словаря
- d.set("cat", "кошка");
- d.set("dog", "собака");
- d.set("elephant", "слон");
- d.set("penguin", "пингвин");
- d.set("Vasya", "Вася");
- d.set("Crow", "Ворон");
- f.dump(d);
- // ---------------------------------------------------
- tStringDict * q; // определяем указатель на будущий словарь
- q = f.load(); // получаем указатель на новый словарь из load
- cout << q->repr(); // выводим строкове представления для просмотра
- _getch();
- }
Advertisement
Add Comment
Please, Sign In to add comment