Видите, используются методы Save() и Load() класса CObject? В CObject они виртуальные. Значит свой класс надо делать потомком CObject и писать в нем свои методы Save() и Load().
Если классы простые и их можно заменить структурами, тогда можно использовать функции FileWriteStruct() и FileReadStruct().
С простыми классами понятно. Но если объект содержит строковые переменные или динамические массивы, как сохранить такой объект?
Вам уже ответили.
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Сохранение объекта класса в файл
Dmitry Fedoseev, 2018.08.28 08:41
Видите, используются методы Save() и Load() класса CObject? В CObject они виртуальные. Значит свой класс надо делать потомком CObject и писать в нем свои методы Save() и Load().
Если классы простые и их можно заменить структурами, тогда можно использовать функции FileWriteStruct() и FileReadStruct().
Я бы не писал сюда если бы знал как это реализовать. В начале попросил дать, если не сложно, короткий пример сохранения объекта класса в файл.
class CBase : public CObject { private: string strValue; double dblValue; double arrValue[]; long lngValue; int intValue; public: CBase(void); ~CBase(void); };
Можно ли объект вышеописанного класса сохранить в один файл. Или нужно создавать, как советовалось, метод, в котором по-отдельности сохранять типы string, double, int, отдельно массив.
Я бы не писал сюда если бы знал как это реализовать. В начале попросил дать, если не сложно, короткий пример сохранения объекта класса в файл.
Можно ли объект вышеописанного класса сохранить в один файл. Или нужно создавать, как советовалось, метод, в котором по-отдельности сохранять типы string, double, int, отдельно массив.
Реализации из коробки нет. Вам необходимо самостоятельно написать весь функционал сохранения класса в файл. Для этого все его поля strValue, dblValue и т.д. нужно сконвертировать в текстовой а лучше в бинарный формат, а затем этот массив сохранить в файл. Имея данные в бинарном формате, можно дополнительно сжать их, используя архиватор Zip, что хорошо скажется на скорости доступа к файлу и его размере.
Структуры, содержащие динамические объекты(динамические массивы, строковые литералы которые в С++ являются такими же динамическими массивами), передавать в файл нельзя, причем это, как я понял не их ограничение, а WinAPI.
Как я сам это обошел:
- Стоит задача - передать структуру, содержащую название инструмента.
- В структуре объявляем не string symbol, а ushort symbol[10].
- Пишем функцию, которая переносит посимвольно литерал в массив кодов unicode, оставшиеся неиспользованными элементы массива инициализируем 0х00.
- Пишем обратную функцию.
В результате, получаем структуру без динамического объекта.
В случае с динамическим массивом, выход могу предложить следующий:
- Стоит задача передать массив double a[].
- Объявляем в структуре массив с заведомо большим количеством элементов, например double a[10000].
- Объявляем в структуре переменную int b, в котрую передаем размер массива, который нужно передать, это нужно для того, что бы определить конец передаваемого массива в массиве а[10000] (у нас же значения последних элементов передаваемого массива могут быть равны 0х00).
- Далее все по аналогии со строковым литералом.
Структуры, содержащие динамические объекты(динамические массивы, строковые литералы которые в С++ являются такими же динамическими массивами), передавать в файл нельзя, причем это, как я понял не их ограничение, а WinAPI.
Как я сам это обошел:
- Стоит задача - передать структуру, содержащую название инструмента.
- В структуре объявляем не string symbol, а ushort symbol[10].
- Пишем функцию, которая переносит посимвольно литерал в массив кодов unicode, оставшиеся неиспользованными элементы массива инициализируем 0х00.
- Пишем обратную функцию.
В результате, получаем структуру без динамического объекта.
В случае с динамическим массивом, выход могу предложить следующий:
- Стоит задача передать массив double a[].
- Объявляем в структуре массив с заведомо большим количеством элементов, например double a[10000].
- Объявляем в структуре переменную int b, в котрую передаем размер массива, который нужно передать, это нужно для того, что бы определить конец передаваемого массива в массиве а[10000] (у нас же значения последних элементов передаваемого массива могут быть равны 0х00).
- Далее все по аналогии со строковым литералом.
Ого. Это какой-то головняк, хотя.. я понимаю о чём Вы говорите, но..
Я бы предложил топикстатрету осилить работу с СУБД, например, sqlite3. Да, неделю можно выкинуть из жизни по непривычке, но.. Преимущество очевидно. Скорость записи в базу данных в разы быстрее и как-бы это сказать, комфортнее. Я это сделал, когда увидел некоторе моменты при работе с нативной мкл функцией записи в файл, есть там с передачей ключа или как его назвать костыль. Я продолбался несколько часов. Потом всё-таки костыль был определён. Но мне это не понравилось. Привычки писать так, как нравится, и не забивать мозг дополнительныцми костылями. Хотя, нативные средства тоже работают, но мне они не понравились как-то.
Хотя, теритически не важно на чёи писать, если скорость не важно. Либой объект это набор полей разного типа и не более того. Пишешь каждое поле отдельно и всё..
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Здравствуйте.
Может кто-нибудь подсказать как сохранить объект класса в файл, и как его потом прочитать. Хочется чтобы программа сохраняла в файл объект. Чтобы не пользоваться отдельными функциями FileWrite, FileWriteString, FileWriteDouble, и аналогичными функциями для чтения.
Есть 2 метода в файле FileBin.mqh, находится в папке Include/Files/FileBin.mqh:
для записи
для чтения
У кого есть опыт, можете показать короткий пример сохранения в файл объекта, и затем чтения из файла.