Название: ваши варианты решения задачи Отправлено: BuRn от Ноябрь 24, 2011, 22:07 лично у меня даже мысли нет
Задача такая, есть массив , двумерный, колличество строк и столбцов мы не знаем, пишем его в бинарный файл, после записи нужно как-то прочитать, грубо говоря восстановить в такой же динамический массив, тут проблема не известно под сколько элементов выделять память Название: Re: ваши варианты решения задачи Отправлено: BRE от Ноябрь 24, 2011, 22:08 А как мы его пишем в файл?
Название: Re: ваши варианты решения задачи Отправлено: BuRn от Ноябрь 24, 2011, 22:13 до NULL
Код: for(int i=0;p[i]!=NULL;i++) Название: Re: ваши варианты решения задачи Отправлено: BuRn от Ноябрь 24, 2011, 22:14 думаю может попробовать так, читать. если цифра , переопределять память выделив на n+1 элемент и писать уже туда
Название: Re: ваши варианты решения задачи Отправлено: BRE от Ноябрь 24, 2011, 22:16 до NULL Значит мы можем посчитать сколько в нем строк и столбцов. :)Мы можем оставить место в файле перед массивом и сохранить точное количество строк/столбцов после сохранения массива. Название: Re: ваши варианты решения задачи Отправлено: BuRn от Ноябрь 24, 2011, 22:17 без подсчета тупым прогоном по всему массиву до нул
Название: Re: ваши варианты решения задачи Отправлено: BRE от Ноябрь 24, 2011, 22:18 без подсчета тупым прогоном по всему массиву до нул Ну да, считать во время самого сохранения, потом сделать seek в нужное место файла и сохранить полученные значения.Название: Re: ваши варианты решения задачи Отправлено: Rem Norton от Ноябрь 25, 2011, 11:06 Заголовок файлу нужен, с указанием количества строк и столбцов. Реализацию сделать?
Название: Re: ваши варианты решения задачи Отправлено: Igors от Ноябрь 25, 2011, 11:17 Ну да, считать во время самого сохранения, потом сделать seek в нужное место файла и сохранить полученные значения. Если так то лучше делать общий механизм (IFF). А в данном случае проще и быстрее прогон для определения кол-ва элементов. Хотя неизвестно сколько будет таких случаев Название: Re: ваши варианты решения задачи Отправлено: BRE от Ноябрь 25, 2011, 11:33 Если так то лучше делать общий механизм (IFF). Наверное еще лучше так никогда не делать. :)А что скрывается за красивым сокращением IFF? Название: Re: ваши варианты решения задачи Отправлено: Пантер от Ноябрь 25, 2011, 11:41 Как вариант, использовать "магическое число" для разделения строк.
Название: Re: ваши варианты решения задачи Отправлено: Igors от Ноябрь 25, 2011, 11:42 А что скрывается за красивым сокращением IFF? А я уже и не помню аббревиатуру :)В терминах Qt примерно такой scoped Код Запись Код Любые данные могут быть записаны в произвольном порядке, при чтении могут быть пропущены Название: Re: ваши варианты решения задачи Отправлено: kambala от Ноябрь 25, 2011, 13:47 Как вариант, использовать "магическое число" для разделения строк. я тоже об этом подумал, но должны быть гарантии, что такое число не может быть валидным во входных данныхНазвание: Re: ваши варианты решения задачи Отправлено: Пантер от Ноябрь 25, 2011, 13:50 Как вариант, использовать "магическое число" для разделения строк. я тоже об этом подумал, но должны быть гарантии, что такое число не может быть валидным во входных данныхНазвание: Re: ваши варианты решения задачи Отправлено: Bepec от Ноябрь 25, 2011, 13:57 Как вариант использовать число разделитель вместе со стаффингом. (заменой этого числа последовательность других.)
Пример приведу только байтовый, другого увы нету. «A1h» должен быть заменен на последовательность «BDh DCh», байт «BDh» – на последовательность «DBh DDh». Соответственно если проникнуться этой мыслью (а это непросто), то в записанных данных строк этого типа никогда не будет :) Название: Re: ваши варианты решения задачи Отправлено: Igors от Ноябрь 25, 2011, 14:18 Возня с "записанным терминатором" лишена смысла. Допустим p[ i ] был простым массивом созданным new. Как его тогда распределить перед чтением? Ну читать сначала в контейнер и.т.п - дешевле не выходит.
Так или иначе читающий должен сначала узнать "сколько байт данных читать", поэтому не стоит "изобретать велосипед" :) Название: Re: ваши варианты решения задачи Отправлено: Пантер от Ноябрь 25, 2011, 14:19 Возня с "записанным терминатором" лишена смысла. Допустим p[ i ] был простым массивом созданным new. Как его тогда распределить перед чтением? Ну читать сначала в контейнер и.т.п - дешевле не выходит. Согласен, об этом я не подумал. Но я бы заюзал вектор. :)Так или иначе читающий должен сначала узнать "сколько байт данных читать", поэтому не стоит "изобретать велосипед" :) Название: Re: ваши варианты решения задачи Отправлено: Bepec от Ноябрь 25, 2011, 14:20 Согласен с Igors. Выделить вначале фиксированный блок информации о файле. Кол-во строк, столбцов.
А так любой в принципе сериализатор справится :) Название: Re: ваши варианты решения задачи Отправлено: Igors от Ноябрь 25, 2011, 14:28 Но я бы заюзал вектор. :) Все равно. Часто бывает где-то насвистел (или файл испорчен), ну и push_back заезжает "куда Макар телят не гонял". Придется отваливаться по exception, потом хз как восстановиться и.т.п. Нужен контроль считанной длины Название: Re: ваши варианты решения задачи Отправлено: kambala от Ноябрь 25, 2011, 15:23 Выделить вначале фиксированный блок информации о файле. Кол-во строк, столбцов. так это тогда просто. я думал автору нужно именно считывать просто поток байт, без какой-либо дополнительной информации (кроме того, что эта последовательность чисел - двумерный массив). |