Russian Qt Forum

Программирование => С/C++ => Тема начата: BuRn от Ноябрь 24, 2011, 22:07



Название: ваши варианты решения задачи
Отправлено: 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++)
     for(int j=0;p[i][j]!=NULL;j++)


Название: 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
Код
C++ (Qt)
struct CBackTrack {
CBackTrack( unsigned int tagID, QDataStream & stream ) : mStream(stream)
{
  mStream << tagID;
  mSavedPos = mStream.device()->pos();
  mStream << (int) 0;
}
 
~CBackTrack( void )
 {
   qint64 pos = mStream.device()->pos();
   mStream.device()->seek(mSavedPos);
   mStream << unsigned int (pos - mSavedPos);
   mStream.device()->seek(pos);
 }
 
QDataStream & mStream;
qint64 mSavedPos;
};
 
Запись
Код
C++ (Qt)
CBackTrack btArr('ARRA', stream);
for(int i=0;p[i]!=NULL;i++) {
    CBackTrack btRow('ROW1', stream);
    for(int j=0;p[i][j]!=NULL;j++)
      ....
}
 
Любые данные могут быть записаны в произвольном порядке, при чтении могут быть пропущены


Название: 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
Выделить вначале фиксированный блок информации о файле. Кол-во строк, столбцов.
так это тогда просто. я думал автору нужно именно считывать просто поток байт, без какой-либо дополнительной информации (кроме того, что эта последовательность чисел - двумерный массив).