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

Вниз

Никак не получается сохранить структуру.   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.035 c
1-1122017906
stud
2005-07-22 11:38
2005.08.14
обратиться к потоку в рантайм


1-1121526080
lilo
2005-07-16 19:01
2005.08.14
TEdtit and ES_PASSWORD


4-1118609407
g-l-u-k
2005-06-13 00:50
2005.08.14
SetDlgItemText


14-1121956424
lookin
2005-07-21 18:33
2005.08.14
Простуда и температура воздуха...


1-1122146379
Trenno
2005-07-23 23:19
2005.08.14
Копирование CopyRect