Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-88243
retlion
2003-03-12 10:02
2003.03.27
Нужны доки по контроллеру доступа ACT2000


6-88106
_MAD_
2003-02-04 14:10
2003.03.27
Bytesend; Byteresive


14-88242
AlexanderSK
2003-03-12 15:31
2003.03.27
Опция - Build with run-time packages


3-87837
Pat
2003-03-08 11:23
2003.03.27
Переезжаем с Paradox a на Access :-))


6-88110
harismatik
2003-02-05 15:39
2003.03.27
Прием файла по HTTP протоколу





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский