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

Вниз

Сохранить и загрузить из файла информацию из массивов   Найти похожие ветки 

 
SergP.   (2005-09-29 18:47) [0]

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

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

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?


 
begin...end ©   (2005-09-29 18:54) [1]

> SergP.   (29.09.05 18:47)

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

Rewrite(F, 1)

> и append?

?!


 
Jeer ©   (2005-09-29 18:54) [2]

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


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

может это поможет
http://delphimaster.net/view/2-1127922780/


 
wicked ©   (2005-09-29 23:25) [4]

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


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


> > и 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
> забыть, как о страшном сне...


почему?


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

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


 
SergP.   (2005-09-30 03:29) [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 и его потомками думаю сам разберусь...


 
begin...end ©   (2005-09-30 08:27) [8]

> 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 09:05) [9]


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


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


 
begin...end ©   (2005-09-30 11:20) [10]

> 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 11:54) [11]


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


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


 
wicked ©   (2005-09-30 17:14) [12]


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

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


 
AlexWlad ©   (2005-09-30 19:58) [13]


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

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



Страницы: 1 вся ветка

Текущий архив: 2005.10.23;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.033 c
4-1124474620
Urdolphin
2005-08-19 22:03
2005.10.23
DelphiLamer.ru или Не дай вирусу проникнуть! 2


1-1128086706
fet
2005-09-30 17:25
2005.10.23
Оконтуривание в Delphi


1-1128107196
Volf_555
2005-09-30 23:06
2005.10.23
Как в Delphi "запустить" reg-файл из TMemo?


4-1124405168
NikNet
2005-08-19 02:46
2005.10.23
помогите сохранить экран на API...?


3-1126604417
Пытающийся
2005-09-13 13:40
2005.10.23
Помогите поднять SQL2000 Server