![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Никак не получается сохранить структуру. [D7, Win95/98, WinXP]
Kolan © (2005-07-26 12:24:00)Здравствуйте,
Есть у меня приличного размера структура надо её сохранить.
Вот структура:
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в (*).
Kolan (2005-07-27 13:44:00) [1]
> begin...end © (27.07.05 12:53) [6]
Ну дык сократить старался.
Всё работает. Доделал наконец, там структура полей в 20 была.... :).
begin...end (2005-07-27 12:53:00) [2]> Kolan © (27.07.05 12:46) [4]
> В процедуре чтения было
> FS := TFileStream.Create(FileName, fmCreate);
Если бы Вы в самом начале привели ВЕСЬ код (включая создание экземпляра TFileStream в обоих случаях), то ошибка была бы найдена намного быстрее.
begin...end (2005-07-27 12:50:00) [3]> Kolan © (27.07.05 12:27) [2]
> Да делаю.. просто не привёл.
Тогда я не понимаю, почему Ваш код [0] работает неверно.
> Kolan © (27.07.05 12:37) [3]
> Это же 3х мерный массив.
Это 2х мерный массив.
> А так я запишу только Первый эломент(те массив из двух эл).
Вы попробуйте, попробуйте.
> Мож имелось ввиду
Имелось в виду именно то, что написано.
Kolan (2005-07-27 12:46:00) [4]Всё проблема была в Copy/Paste
В процедуре чтения было
FS := TFileStream.Create(FileName, fmCreate);
Вместо
FS := TFileStream.Create(FileName, fmOpenRead);
Благодарю за помощь. :)
Kolan (2005-07-27 12:37:00) [5]
> FS.WriteBuffer(Arr[0], L * sizeof(Arr[0]))
Это не понял. Это же 3х мерный массив. А так я запишу только Первый эломент(те массив из двух эл). Мож имелось ввиду
FS.WriteBuffer(Arr[I], L * sizeof(Arr[0]))
Kolan (2005-07-27 12:27:00) [6]Ага шас попробую. Пасиба :)
> FS.Seek(0, soFromBeginning) нужно делать и перед началом
> чтения тоже.
Да делаю.. просто не привёл.
begin...end (2005-07-26 13:37:00) [7]> 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]))