Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2006.06.04;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.045 c
15-1146930890
Nick Denry
2006-05-06 19:54
2006.06.04
как настроить apache локально?


2-1147693593
LaDaN
2006-05-15 15:46
2006.06.04
Линейные односвязные списки


4-1142232387
ksa2002
2006-03-13 09:46
2006.06.04
com порт , чтение и запись через два потока


2-1147693782
Std
2006-05-15 15:49
2006.06.04
MessageDlg + нажатие кнопки


2-1148119967
tytci2007
2006-05-20 14:12
2006.06.04
Как упаковать в 6 байт дату и время





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский