Форум: "Основная";
Текущий архив: 2003.03.27;
Скачать: [xml.tar.bz2];
ВнизЗапись массива в файл. Найти похожие ветки
← →
Сергей (2003-03-11 18:03) [0]Не подскажете, как проще всего записать динамический массив данных (данные типа record, каждая из которых тоже содержит динамические массивы)в файл.
← →
uw (2003-03-11 18:04) [1]BlockWrite
← →
Сергей (2003-03-11 18:07) [2]BlockWrite, а как вычислить размер буфера
← →
Сергей (2003-03-11 18:09) [3]Или вернее, так - что возвращает sizeOf(x) где x -динамический массив
← →
Anatoly Podgoretsky (2003-03-11 18:14) [4]4
← →
Сергей (2003-03-11 18:15) [5]Anatoly Podgoretsky : А что такое это 4. У меня возвращает 9. И может подскажете, как запихать массив в поток?
← →
Anatoly Podgoretsky (2003-03-11 18:33) [6]Ты же спрашивал, что возвращает sizeOf(x) где x -динамический массив - вот это и возвращает, для всех массивов
← →
Serginio (2003-03-11 18:50) [7]Легче всего Использовать IStorage с уникальными названиями IStrem
например ST+IntToStr(Integer(@dynArray[0]). Соответственно длина стрима для динамического массива=Length(dynArray)*SizeOf(record);
Если использовать TFileStream придется переделывать записи чтобы ссылка на точерний стреам содержала смещение в файле и размер массива. Можно также реализовать через связные списки.
← →
Palladin (2003-03-11 19:17) [8]
> Serginio (11.03.03 18:50)
какие IStorage, какие списки???
var
da:array of TMyRec;
f:file;
....
blockwrite(f,da[low(da)],SizeOf(TMyRec)*Length(da));
← →
Serginio (2003-03-11 20:12) [9]Serginio (11.03.03 18:50) смотри топик
"записать динамический массив данных (данные типа record, каждая из которых тоже содержит динамические массивы)в файл".
← →
Anatoly Podgoretsky (2003-03-11 20:18) [10]Бессиысленно, массив обычныз данных еще можно записать, но записи, членами которого являются динамические структуры уже нет, точнее можно, но какой толк от указателей в этих записях
← →
Palladin (2003-03-11 20:32) [11]сорри про динмассивы внутри не заметил...
← →
Serginio (2003-03-11 20:45) [12]Вернее например "ST"+IntToStr(Integer(ar[j].dynArray)). А при чтении
OpenStream("ST"+IntToStr(Integer(ar[j].dynArray)),nil, OF_READWRITE,nil,Stream);
SetLength(DinArray,Stream.Size);
Stream.read(@DinArray[0],Stream.Size,Count);
Integer(ar[j].dynArray):=0;
ar[j].dynArray:=DinArray;
Что то типа этого.
← →
jack128 (2003-03-11 20:55) [13]Почему нельзя записать?? все можно..
я так понял есть
type
TMyRec = record
IntArr : array of integer;
k : integer;
end;
и надо записать array of TMyRec; так ?
ну и в чем проблема?
TArrOfMyRec = array of TMyRec;
procedure SaveMyRec(Stream : TStream;Rec : tMyRec);
var Temp : integer;
begin
Temp := Lenght(Rec.IntArr);
Write(Temp,SizeOf(Integer));
Write(PChar(Rec.IntArr)^,Temp*SizeOf(integer));
Write(Rec.k,SizeOf(Integer));
end;
procedure SaveArrOfMyRec(Stream : TStream; ArrRec : TArrOfMyRec);
var Temp, i : Integer;
begin
Temp := Length(ArrRec);
Write(Temp,SizeOf(ArrRec));
for i := 0 to Temp - 1 do
SaveMyRec(ArrRec[i]);
end;
Суть в том, что сначало пишем размер массива, а затем сам массив
← →
Verg (2003-03-11 21:06) [14]var X : array of <какой-то тип>;
F : file;
..............
rewrite(F, sizeof(x[0]));
blockwrite(F, x[0], length(x));
system.close(f);
.......
← →
Anatoly Podgoretsky (2003-03-11 21:06) [15]Только это будет уже совсем другое, не запись массива, а создание файла с нетипизированной структурой, но запись может быть очень сложной структуры.
← →
jack128 (2003-03-11 22:52) [16]>Anatoly Podgoretsky © (11.03.03 21:06)
>Только это будет уже совсем другое, не запись массива, а
>создание файла с нетипизированной структурой, но запись может
>быть очень сложной структуры.
В исходном вопросе про типизированные файлы вроде нечего небыло ;-)
← →
Сергей (2003-03-12 08:50) [17]rewrite(F, sizeof(x[0]));
blockwrite(F, x[0], length(x));
system.close(f);
Этот вариант не годиться, потому, что sizeof(x[0])не возвращает размер x[0] (x[0] содержит несколько многомерных динамических массивов данных).
Вариант, который предложил jack128 - по сути вариант записи каждго поля записи по отдельности, тоже не подходит, т. к. структура записи сложна и не хочется заморачиваться.
Подскажите пожалуйста недоучке, как правильно подсчитать размер буфера для динамического массива записей (каждая запись содержит динамические структуры).
← →
Digitman (2003-03-12 09:31) [18]
> Сергей
проще всего будет отказаться от record-структур и хранить свою инф-цию в вариантных массивах
var MyVarData : Variant;
MyVarData := VarArrayCreate(...);
или
MyVarData := VarArrayOf(...);
дальше, по образу и подобию методов TDataBlockInterpreter.WriteVariant()/ReadVariant(), реализуешь собств.ф-ции, которые будут записывать в поток / считывать из потока вариантные типы данных
Ну а уж записать в файл / прочитать из файла готовый поток - плевое дело)
← →
Serginio (2003-03-12 12:49) [19]Да только можно посмотреть реализацию TDataBlockInterpreter.WriteVariant и зделать по своему.
← →
Digitman (2003-03-12 13:09) [20]
> Serginio
именно -по-своему ! потому что интерпретатор там не непосредственно с потоком работает, а с интерфейсом IDataBlock, в котором поток реализован
← →
jack128 (2003-03-12 20:53) [21]2 Сергей (12.03.03 08:50)
А можно посмотреть на эту сложную структуру??
← →
Anatoly Podgoretsky (2003-03-12 20:56) [22]jack128 © (11.03.03 22:52)
Внимательно смотри (ищи) в вопросе слово record
← →
Tux (2003-03-12 23:09) [23]Плавно приплыли к сериализации и маршалингу!
← →
ghg (2003-03-13 07:50) [24]>Сергей (12.03.03 08:50)
>Вариант, который предложил jack128 - по сути вариант записи >каждго поля записи по отдельности, тоже не подходит, т. к. >структура записи сложна и не хочется заморачиваться.
На самом деле этот вариант не сильно заморочный (проверял), хотя кажется что это гемор. А главное все работает ... :)
← →
pasha676 (2003-03-13 09:16) [25]Мож я же пропустил в ответах. Но почему никто не предложил создать file of TMyRecord и записывать каждую запись по отдельности. Можно ввести в рекорд поле "номер в массиве". Тогда потом из файла массив можно собрать полюбому.
← →
Anatoly Podgoretsky (2003-03-13 09:19) [26]Ты многое пропустил, часть записи являются динамические структуры и возможно сложные
← →
jack128 (2003-03-13 19:27) [27]>Anatoly Podgoretsky © (12.03.03 20:56)
>jack128 © (11.03.03 22:52)
>Внимательно смотри (ищи) в вопросе слово record
Как не странно слово рекорд я вопросе нашел ;), а жесткую взаимосвязь между записями и типизированными файлами(file of ...) - нет...
← →
Anatoly Podgoretsky (2003-03-13 20:31) [28]рекорд это фиксированый размер и запись его есть запись в типизированный файл
← →
Serginio (2003-03-13 20:38) [29]Надо внимательно читать==
"записать динамический массив данных (данные типа record, каждая из которых тоже содержит динамические массивы)в файл".
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.03.27;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.009 c