Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2005.10.23;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.037 c
14-1127898327
nk
2005-09-28 13:05
2005.10.23
Чем можно открыть автокадовские файлы... кроме автокада ?!! ))


6-1120273852
yurikon
2005-07-02 07:10
2005.10.23
ICQ


5-1104096308
alo
2004-12-27 00:25
2005.10.23
добавить свойство классу TListColumn ?


3-1126169737
Prohodil Mimo
2005-09-08 12:55
2005.10.23
Можно ли к существующему FOREIGN KEY добавить ON DELEET CASCADE?


6-1120546729
Интиресующийся
2005-07-05 10:58
2005.10.23
И снова TServerSocket!





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский