Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Сохранить и загрузить из файла информацию из массивов [D6, WinME, Win2k, WinXP]


SergP. ©   (2005-09-29 18:47:00) 

Нужно сохранять и загружать из файла информацию из массивов (статических и динамических), т.е. в одном файле должна содержаться информация сразу из нескольких массивов.
Например в моем случае мне нужно сохранить данные из нескольких переменных, затем статический массив, потом кол-во записей динамическиго массива, затем сам этот динамический массив ( и это все в один файл).

Просто сохранить содержимое одного массива - это понятно.
Типа так:

history: array of histrecord;
...

procedure savearray;
var
 f:file;
begin
 assignfile(f,'file.dat');
 rewrite(f,sizeof(histrecord));
 blockwrite(f,history[0],length(history));
 closefile(f);
end;

Но если сохранять (загружать) разнородные данные, то как в таком случае правильно пользоваться rewrite и append?


AlexWlad   (2005-09-30 19:58:00) [1]


> wicked ©   (30.09.05 17:14) [12]

Полностью поддерживаю и всем рекомендую... ;)
Assign пользую только для построчного чтения текстовых файлов.


wicked   (2005-09-30 17:14:00) [2]


> А вот об "AssignFile", а также Reset, ReWrite, BlockRead,
>  BlockWrite... - он явно не прав!
> Скорее всего тут "Функцияфобия", связанная с "неудачным
> использованием оной"!

неправда ваша.... сознательный выбор в пользу более гибкого и мощного решения... если привязывать хранение данных к TStream и потомкам, то можно абстрагироваться от того, где именно хранятся данные - в файле, в оперативной памяти, в потоке IStream, BLOB-поле или еще где-то..... также упрощается транспортирование данных - будь то буфер обмена, сокет или один из компонентов ICS....
так что AssignFile сотоварищи проигрывают по всем фронтам TStream'у с потомками....


SergP.   (2005-09-30 11:54:00) [3]


> begin...end ©   (30.09.05 11:20) [10]


Понял... А ведь когда-то давно знал, а щас забыл... Именно это и вызвало в данное время у меня сабжевое затруднение. Я что-то сначала не подумал что можно установить 1 и писать что угодно,  а почему-то думал что нужно обязательно устанавливать равным размеру элемента массива...


begin...end   (2005-09-30 11:20:00) [4]

> SergP.   (30.09.05 09:05) [9]

Справка по Reset:

If F is an untyped file, RecSize specifies the record size to be used in data transfers.

Справка по BlockRead:

BlockRead reads Count or fewer records from the file F into memory, starting at the first byte occupied by Buf. (...) The entire transferred block occupies at most Count * RecSize bytes. RecSize is the record size specified when the file was opened (or 128 if the record size was not specified).

В [8] размер записи равен одному байту. Вызывая BlockRead, нужно указать количество записей , которое нужно прочитать. Указываем нужное количество байт (потому что в [8] запись = байт) и читаем.


SergP.   (2005-09-30 09:05:00) [5]


> begin...end ©   (30.09.05 08:27) [8]


Я что-то последние несколько дней сильно туплю, но...
Тогда мне просто непонятно какой смысл имеет второй параметр (размер блока данных) у процедур Rewrite и reset ?


begin...end   (2005-09-30 08:27:00) [6]

> SergP.   (30.09.05 03:29) [7]

> Ну вобщем если по assignfile нет никаких предложений...

Извините, а в [1] разве никакого предложения нет?

> SergP.   (30.09.05 01:54) [5]

> ;Сохранение некоторых переменных
> write(f,переменная1);
> write(f,переменная2);
>
> ; Сохранение статического массива
> blockwrite(f,статмассив,4);
>
> ;Сохранение динамического массива
> write(f, length(динмассив);
> blockwrite(f,динмассив[0],length(динмассив));

var
 F: file;
 Len: Integer;
 ByteVariable: Byte;
 IntegerVariable: Integer;
 StaticArray: array [1..10] of Word;
 DynamicArray: array of Integer;
begin
 ...
 // Запись
 AssignFile(F, 'E:\MyFile.bin');
 Rewrite(F, 1);
 try
   BlockWrite(F, ByteVariable, sizeof(ByteVariable));
   BlockWrite(F, IntegerVariable, sizeof(IntegerVariable));
   BlockWrite(F, StaticArray, sizeof(StaticArray));
   Len := Length(DynamicArray);
   BlockWrite(F, Len, sizeof(Len));
   BlockWrite(F, DynamicArray[0], Len * sizeof(DynamicArray[0]))
 finally
   CloseFile(F)
 end;
 ...
 // Чтение
 AssignFile(F, 'E:\MyFile.bin');
 Reset(F, 1);
 try
   BlockRead(F, ByteVariable, sizeof(ByteVariable));
   BlockRead(F, IntegerVariable, sizeof(IntegerVariable));
   BlockRead(F, StaticArray, sizeof(StaticArray));
   BlockRead(F, Len, sizeof(Len));
   SetLength(DynamicArray, Len);
   BlockRead(F, DynamicArray[0], Len * sizeof(DynamicArray[0]))
 finally
   CloseFile(F)
 end
 ...
end.


SergP.   (2005-09-30 03:29:00) [7]


> Германн ©   (30.09.05 03:01) [6]
> 2 SergP.   (30.09.05 01:54) [5]
> Идею wicked ©   (29.09.05 23:25) [4] дал, имхо, очень правильную!
>


Вобще-то я подумаю... Мне это тоже нравится... Даже это лучше тем что я по ходу действия могу еще и сжать сохраняемые данные например zlib'ом...а при чтении разжать...

Ну вобщем если по assignfile нет никаких предложений, то с TStream и его потомками думаю сам разберусь...


Германн   (2005-09-30 03:01:00) [8]

2 SergP.   (30.09.05 01:54) [5]
Идею wicked ©   (29.09.05 23:25) [4] дал, имхо, очень правильную!
А вот об "AssignFile", а также Reset, ReWrite, BlockRead, BlockWrite... - он явно не прав!
Скорее всего тут "Функцияфобия", связанная с "неудачным использованием оной"!


SergP.   (2005-09-30 01:54:00) [9]


> > и append?
>
> ?!


Ну это я ошибся...


> Jeer ©   (29.09.05 18:54) [2]
> Пока не определишься со структурой файла - не будет "счастия"


Почему Вы считаете что я с ней не определился? Я же написал примерно чего хочу... Более точное описание не меняет сути...

Хотелось бы как-то типа так:

;Сохранение некоторых переменных
write(f,переменная1);
write(f,переменная2);

; Сохранение статического массива
blockwrite(f,статмассив,4);

;Сохранение динамического массива
write(f, length(динмассив);
blockwrite(f,динмассив[0],length(динмассив));

а потом чтобы прочитать это все можно было... Только как это все объединить при записи одного файла?


> использовать лучше TStream и его потомки, а об assignfile
> забыть, как о страшном сне...


почему?


wicked   (2005-09-29 23:25:00) [10]

данные писать в виде <подпись><размер><блок данных> либо, для однородгого массива <подпись><кол-во элементов><элементы>....
использовать лучше TStream и его потомки, а об assignfile забыть, как о страшном сне...


Fl@sh   (2005-09-29 19:00:00) [11]

может это поможет
http://delphimaster.ru/cgi-bin/forum.pl?n=18&id=1127922780


begin...end   (2005-09-29 18:54:00) [12]

> SergP.   (29.09.05 18:47)

> Но если сохранять (загружать) разнородные данные, то как
> в таком случае правильно пользоваться rewrite

Rewrite(F, 1)

> и append?

?!


Jeer   (2005-09-29 18:54:00) [13]

Пока не определишься со структурой файла - не будет "счастия"


Наверх

Титульная страница Поиск, карта сайта Написать письмо