Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.03.27;
Скачать: CL | DM;

Вниз

Запись массива в файл.   Найти похожие ветки 

 
Сергей   (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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.024 c
7-88281
Калашников Игорь
2003-02-02 04:44
2003.03.27
Hint ы, собаки блин


3-87814
Exception
2003-03-09 18:15
2003.03.27
ftMemo и Rich Text Format с RichEdit


14-88138
Ru
2003-03-12 13:15
2003.03.27
Кучма :)


1-87918
Kaginava
2003-03-17 08:16
2003.03.27
TRadioButton


4-88287
Cranber
2003-01-28 06:20
2003.03.27
Получить и установить частоту обновления экрана...