Форум: "Основная";
Текущий архив: 2005.08.14;
Скачать: [xml.tar.bz2];
ВнизНикак не получается сохранить структуру. Найти похожие ветки
← →
Kolan © (2005-07-26 12:24) [0]Здравствуйте,
Есть у меня приличного размера структура надо её сохранить.
Вот структура:TPairArray = array[0..1] of Double;
TArrayOfTPair = array of TPairArray;
{...}
PMeasurmentData = ^TMeasurmentData;
TMeasurmentData = record
{OutPut}
OutPutGraff: TArrayOfTPair;
{...}
Вот начало процедуры сохранения:procedure SaveMeasurmentToFile(MeasurmentDataRec: PMeasurmentData;
FileName: string);
var
FS: TFileStream;
begin
FS := TFileStream.Create(FileName, fmCreate);
try
FS.Seek(0, soFromBeginning);
WritePairArrayToStream(FS, MeasurmentDataRec.OutPutGraff);
Тк там несколько типов дин массивав на каждый написал свою проедуру вот в частности WritePairArrayToStream:procedure WritePairArrayToStream(var FS: TFileStream; Arr: TArrayOfTPair);
var
L: Longint;
I: Integer;
begin
if FS <> nil then
begin
L := High(Arr) - Low(Arr) + 1;
FS.WriteBuffer(L, SizeOf(Longint));
for I := Low(Arr) to High(Arr) do
begin
FS.WriteBuffer(Arr[I, 0], SizeOf(Arr[I, 0]));
FS.WriteBuffer(Arr[I, 1], SizeOf(Arr[I, 1]));
end;
end;
end;
Получаю файл в 0 байт.
PS Сначала ошибсяFS.Seek(0, soFromBeginning);
не написал. Файл получался не 0. Но загрузить не мог при чтении
procedure ReadPairArrayFromStream(FS: TFileStream; var Arr: TArrayOfTPair);
var
L: Longint;
I: Integer;
begin
FS.ReadBuffer(L, SizeOf(L)); (*)
if L > 0 then
begin
SetLength(Arr, L);
for I := Low(Arr) to High(Arr) do
begin
FS.ReadBuffer(Arr[I, 0], SizeOf(Arr[I, 0]));
FS.ReadBuffer(Arr[I, 1], SizeOf(Arr[I, 1]));
end;
end;
end;
ПолучалStream read error
в (*).
← →
begin...end © (2005-07-26 13:37) [1]> Kolan © (26.07.05 12:24)
FS.Seek(0, soFromBeginning)
нужно делать и перед началом чтения тоже.
Ещё замечания:
> var FS: TFileStream
Спецификатор var можно убрать.
> L := High(Arr) - Low(Arr) + 1
L := Length(Arr)
> for I := Low(Arr) to High(Arr) do
> begin
> FS.WriteBuffer(Arr[I, 0], SizeOf(Arr[I, 0]));
> FS.WriteBuffer(Arr[I, 1], SizeOf(Arr[I, 1]));
> end;
FS.WriteBuffer(Arr[0], L * sizeof(Arr[0]))
> for I := Low(Arr) to High(Arr) do
> begin
> FS.ReadBuffer(Arr[I, 0], SizeOf(Arr[I, 0]));
> FS.ReadBuffer(Arr[I, 1], SizeOf(Arr[I, 1]));
> end;
FS.ReadBuffer(Arr[0], L * sizeof(Arr[0]))
← →
Kolan © (2005-07-27 12:27) [2]Ага шас попробую. Пасиба :)
> FS.Seek(0, soFromBeginning) нужно делать и перед началом
> чтения тоже.
Да делаю.. просто не привёл.
← →
Kolan © (2005-07-27 12:37) [3]
> FS.WriteBuffer(Arr[0], L * sizeof(Arr[0]))
Это не понял. Это же 3х мерный массив. А так я запишу только Первый эломент(те массив из двух эл). Мож имелось ввидуFS.WriteBuffer(Arr[I], L * sizeof(Arr[0]))
← →
Kolan © (2005-07-27 12:46) [4]Всё проблема была в Copy/Paste
В процедуре чтения былоFS := TFileStream.Create(FileName, fmCreate);
ВместоFS := TFileStream.Create(FileName, fmOpenRead);
Благодарю за помощь. :)
← →
begin...end © (2005-07-27 12:50) [5]> Kolan © (27.07.05 12:27) [2]
> Да делаю.. просто не привёл.
Тогда я не понимаю, почему Ваш код [0] работает неверно.
> Kolan © (27.07.05 12:37) [3]
> Это же 3х мерный массив.
Это 2х мерный массив.
> А так я запишу только Первый эломент(те массив из двух эл).
Вы попробуйте, попробуйте.
> Мож имелось ввиду
Имелось в виду именно то, что написано.
← →
begin...end © (2005-07-27 12:53) [6]> Kolan © (27.07.05 12:46) [4]
> В процедуре чтения было
> FS := TFileStream.Create(FileName, fmCreate);
Если бы Вы в самом начале привели ВЕСЬ код (включая создание экземпляра TFileStream в обоих случаях), то ошибка была бы найдена намного быстрее.
← →
Kolan © (2005-07-27 13:44) [7]
> begin...end © (27.07.05 12:53) [6]
Ну дык сократить старался.
Всё работает. Доделал наконец, там структура полей в 20 была.... :).
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.08.14;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.011 c