![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы
![]() |
Поиск в этой теме
![]() |
![]() |
#1 | ||
Старожил
Регистрация: 21.03.2009
Сообщений: 2,193
|
![]()
Доброго времени суток!
Так уж получилось, что до недавнего времени работать с бинарными файлами мне не доводилось, и вот теперь я решил исправить этот недостаток. Для начала я решил записать/считать объект класса, гордо поименованного Базой Данных, содержащего очень простые поля - строку, массив целых чисел, а также длины строки и массива. Оба массива динамические. Я попробовал реализовать функции-члены чтения/записи всех данных класса, начав с функции записи. Получилось примерно вот что: Код:
Код:
Цитата:
Код:
Почесав немного репу сменил параметр с char* на const char*. Вроде бы и впрямь удалось что-то записать в файл. Правда, по-моему, записал только кусок строки. (заменил sizeof(Name) на NameLen - пишет вроде нормально, главная проблема все равно не решилась). Ладно, решил по образу и подобию слепить функцию загрузки из файла: Код:
Цитата:
Код:
Код:
Таким образом прошу подсказать мне - почему же члены класса имеют тип данных const, а также в чем я наошибался и как надо делать правильно?
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта Тема на форуме, посвященная ему же |
||
![]() |
![]() |
![]() |
#2 |
Я
Форумчанин
Регистрация: 24.04.2010
Сообщений: 693
|
![]()
Использовать reinterpret_cast это уже не лучший выход, да еще и в сочетании с const_cast, отсюда и потеря данных
Все персонажи вымышлены, все совпадения случайны.
Если жизнь игра, тогда я её разработчик ©. |
![]() |
![]() |
![]() |
#3 | |
Старожил
Регистрация: 21.03.2009
Сообщений: 2,193
|
![]() Цитата:
И как еще писать данные в бинарные файлы без явного (или - упаси бог! - неявного) преобразования? write и read без этого не работают, а других способов работы с бинарными файлами я не знаю. (про сишные функции не говорю - я хотел бы работать со средствами C++, в данном случае - с потоками)
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта Тема на форуме, посвященная ему же |
|
![]() |
![]() |
![]() |
#4 |
Я
Форумчанин
Регистрация: 24.04.2010
Сообщений: 693
|
![]()
В общем в этих строчках нужно просто преобразовать значения в строковую переменную
Код:
![]()
Все персонажи вымышлены, все совпадения случайны.
Если жизнь игра, тогда я её разработчик ©. |
![]() |
![]() |
![]() |
#5 |
Старожил
Регистрация: 21.03.2009
Сообщений: 2,193
|
![]()
Ну это уже костыли. Как-никак я хочу писать в бинарный файл и использовать его преимущества, в том числе и компактность представления численных данных по сравнению с текстовым представлением. Гораздо лучше записать (2^32-1) как целое в четыре байта, чем как строку в 10 байт. А уж как записывать массив целых? Либо на текст каждого числа те самые 10 байт отводить, либо... Ну да, либо указывать длину строкового представления каждого числа и тоже его записывать. В общем, потери в 2,5 раза.
Да и какой он после этого бинарный файл?
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта Тема на форуме, посвященная ему же |
![]() |
![]() |
![]() |
#6 |
Я
Форумчанин
Регистрация: 24.04.2010
Сообщений: 693
|
![]()
Так будет правильнее:
Код:
Все персонажи вымышлены, все совпадения случайны.
Если жизнь игра, тогда я её разработчик ©. |
![]() |
![]() |
![]() |
#7 |
Я
Форумчанин
Регистрация: 24.04.2010
Сообщений: 693
|
![]()
Вот еще откопал примеры чтения и записи:
Код:
Все персонажи вымышлены, все совпадения случайны.
Если жизнь игра, тогда я её разработчик ©. |
![]() |
![]() |
![]() |
#8 |
Unix C++ developer
Форумчанин
Регистрация: 16.04.2007
Сообщений: 651
|
![]()
Почитайте про сериализацию/десериализацию данных.
|
![]() |
![]() |
![]() |
#9 |
Старожил
Регистрация: 21.03.2009
Сообщений: 2,193
|
![]()
mrChester, знаю про этот вариант. Не подходит, т.к. массивы динамические, а делать статическими - не вариант.
oleg kutkov, хорошо, посмотрю что пишут. Если имеется еще какая-то информация по теме - буду рад узнать!
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта Тема на форуме, посвященная ему же |
![]() |
![]() |
![]() |
#10 |
Старожил
Регистрация: 21.03.2009
Сообщений: 2,193
|
![]()
Балда я необразованная! Константные-то члены потому, что я функции объявил как const (особенно мудро это с LoadFromFile!!)! Нет во мне еще тонкого чувства констант...
Впрочем, проблема с Access violation пока остается. UPD. За-ме-ча-тель-но! Кто будет выделять память под массивы, в которые все это счастье будет считываться - после 1837 года стало непонятно... В общем, ошибки, как всегда, идиотские - зато название темы звучит гордо! Остались, правда, еще небольшие косяки, ну да с ними, думаю, разберусь. UPD2. С проблемой разобрался окончательно, тему можно закрывать!
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта Тема на форуме, посвященная ему же Последний раз редактировалось Гром; 18.05.2010 в 22:34. |
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Файлы: запись/чтение | Proger_1 | БД в Delphi | 0 | 30.04.2010 00:36 |
Структуры,запись в бинарные файлы,массивы(С++) | TOSHH | Общие вопросы C/C++ | 1 | 10.10.2009 02:01 |
VC++ файлы(чтение\запись) | ("")(Э_Є)("") | Общие вопросы C/C++ | 3 | 16.06.2009 14:05 |
Создание классов и использование объектов классов при написании программ в среде C++. | Frozen inside | Помощь студентам | 0 | 16.04.2009 23:18 |
Проекция файла и запись/чтение объектов класса в C++ | sd13 | Помощь студентам | 26 | 25.05.2008 12:05 |