Форум: "Начинающим";
Текущий архив: 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.041 c