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

Вниз

Сохранить/загрузить динамический массив   Найти похожие ветки 

 
alex-drob ©   (2006-05-14 00:22) [0]

Как сохранить, а потом загрузить массив в файл?

Пробую сохранить так:

 setlength(ar,5);
 ar[0]:="str 1";
 ar[1]:="str 2";
 ar[2]:="str 3";
 ar[3]:="str 4";
 ar[4]:="str 5";
 size:=length(ar)*sizeof(string);
 ms:= TMemoryStream.Create;
 ms.WriteBuffer(ar[0],size);
 ms.SaveToFile("c:\1.txt");
 ms.Free;


Вроде всё сохраняеться.

Загружаю так:

 setlength(ar,5);
 ms:= TMemoryStream.Create;
 ms.LoadFromFile("c:\1.txt");
 ms.Read(ar[0],ms.Size);
 memo1.Lines.Add(ar[0]);
 memo1.Lines.Add(ar[1]);
 memo1.Lines.Add(ar[2]);
 memo1.Lines.Add(ar[3]);
 memo1.Lines.Add(ar[4]);
 ms.Free;


Выскакивает ошибка.


 
Rial ©   (2006-05-14 00:55) [1]

И что же это там сохраняется ?!

Дело в том, что String - это только указатель на распределенную в памяти строку, поэтому ты читаешь и записываешь на самом деле совсем не то,
что хотел.

Если не хочется многое менять, то вместо String используй ShortString или String[Len].
Но это глупо по многим причинам...

Лучше используй TStringList и его LoadFromFile,SaveToFile.
Вообще, динамические массивы - это зло :))
GetMem, FreeMem, AllocMem - форева !


 
alex-drob ©   (2006-05-14 01:09) [2]

Дело в том что String я написал к примеру. Мне нужно сохранять и загружать массив компонентов.


 
DevilDevil ©   (2006-05-14 01:27) [3]

ммм...
у TMemoryStream, так же как и у TFileStream есть метод типа WriteComponent. Попробуй, может получится...


 
alex-drob ©   (2006-05-14 01:42) [4]

Компильятор ругаеться что это массив а не компонент.


 
Marser ©   (2006-05-14 02:10) [5]

> [2] alex-drob ©   (14.05.06 01:09)
> Дело в том что String я написал к примеру. Мне нужно сохранять
> и загружать массив компонентов.

То же самое компонент. Размер того же TButton - 4 байта, что соответствует Pointer.
Можно использовать Tobject.InstanceSize, а можно [3]

> [4] alex-drob ©   (14.05.06 01:42)
> Компильятор ругаеться что это массив а не компонент.

Естественно. Так записать сразу весь масив не получится, только по компонентам.


 
begin...end ©   (2006-05-14 08:40) [6]

> Marser ©   (14.05.06 02:10) [5]
> Можно использовать Tobject.InstanceSize

А каким образом здесь можно его использовать, если не секрет?


 
vidiv ©   (2006-05-14 10:01) [7]

Вот пример
var Arr:array of string;
   AStream:TMemoryStream;
   ss,s,i:integer;
begin
   SetLength(Arr, 5);
   Arr[0] := "Line zero";
   Arr[1] := "Line one";
   Arr[2] := "Line two";
   Arr[3] := "Line three";
   Arr[4] := "Line four";

   AStream := TMemoryStream.Create; // òóò ìîæåò áûòü ëþáîé Stream

   s := Length(Arr);
   AStream.WriteBuffer(s, SizeOf(s));

   for i:=0 to pred(s) do begin
       ss := length(Arr[i]);
       AStream.WriteBuffer(ss, SizeOf(ss));
       AStream.WriteBuffer(PChar(Arr[i])^, ss);
   end;

   //

   AStream.Position := 0;
   SetLength(Arr, 0);

   AStream.ReadBuffer(s, SizeOf(s));
   SetLength(Arr, s);
   for i:=0 to pred(s) do begin
       AStream.ReadBuffer(ss, SizeOf(ss));
       SetLength(Arr[i], ss);
       AStream.ReadBuffer(PChar(Arr[i])^, ss);
       Memo1.Lines.Add(Arr[i]);
   end;
end;



Страницы: 1 вся ветка

Текущий архив: 2006.06.04;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.047 c
2-1148055734
KLAUS
2006-05-19 20:22
2006.06.04
HextoString


15-1147344034
Юрий Зотов
2006-05-11 14:40
2006.06.04
Звездные войны... :o)


2-1147852724
Konnor
2006-05-17 11:58
2006.06.04
Поиск


2-1147861873
13
2006-05-17 14:31
2006.06.04
построение графика


4-1142183589
Arazel
2006-03-12 20:13
2006.06.04
Как узнать по PID, в какое время был запущен процесс?