Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Массив в файл [D5, WinXP]


Страницы:   1 2

Justas ©   (2004-10-08 01:17:00) 

Привет всем!
Есть массив a:array [1..31,1..12] of string. Как его сохранить в файл, а потом прочитать из файла?
Кажется, сохранять можно так

with TFileStream.Create('MyArray.dat', fmCreate or fmOpenWrite) do begin
WriteBuffer(a, SizeOf(a));
Free;

Но, я не знаю, как его потом из файла прочитать
Заранее спасибо


Defunct   (2004-10-08 02:11:00) [21]

Justas   (08.10.04 01:17)  
В общем так, поскольку GuruAV похоже не выспался, а я возможно не полностью понял его ответ, отвечу так:

Есть массив:

A : array [1..31,1..12] of string;

// Запись в файл:
Procedure Save(FileName:String);
Var I,J,L:Integer;
Begin
 With TMemoryStream.Create Do
 Try
   For I:=1 To 31 Do
   For J:=1 To 12 Do
   Begin
     { Для String }
     L := Length(A[i,j]);
     WriteBuffer(L, 4);
     WriteBuffer(A[i,j][1], L);
     { Для ShortString }
     {
     WriteBuffer(A[i,j][0],1);
     WriteBuffer(A[i,j][1], Length(A[i,j]));  
     }
   End;
   SaveToFile( FileName );
 Finally
   Free;
 End;
End;

// Чтение из файла:
Procedure Load(FileName:String);
Var I,J,L:Integer;
Begin
 With TMemoryStream.Create Do
 Try
   LoadFromFile(FileName);
   Position := 0;
   For I:=1 To 31 Do
   For J:=1 To 12 Do
   Begin
     { Для String }
     ReadBuffer(L, 4);
     ReadBuffer(A[i,j][1], L);
     { Для ShortString }
     {
       ReadBuffer(A[i,j][0],1);
       ReadBuffer(A[i,j][1], Byte(A[i,j]));  
     }
   End;
 Finally
   Free;
 End;
End;


1488 байт будут занимать одни только длины строк. А Если использовать ShortString потребуется в 4 раза меньше места на хранение длин строк.


GuAV   (2004-10-08 01:56:00) [22]

C Вами про строки - лучше в другой ветке :)


GuAV   (2004-10-08 01:55:00) [23]

Defunct ©   (08.10.04 01:47) [2]
Да я непонятно наверное написал.

или

> shortstring заместо string.


или
Можно ещё писать сначала длинну строки
I:=Length(S);
WriteBuffer(I, SizeOf(I));
а потом саму
WriteBuffer(S[1], I);
Читать при этом так:
ReadBuffer(I, SizeOf(I));
SetLength(S, I)

ReadBuffer(S[1], I);


SetLength для shortstring тоже работает (меняет byte(s[0])), но необходимость приведенного кода отпадает, проще записать все 256 (или меньше) байт строки - и там уже будет и длина.


Defunct   (2004-10-08 01:48:00) [24]

[2]

Соответственно читать при этом так:
ReadBuffer(S[0], 1);
ReadBuffer(S[1], Byte(S[0]));


Defunct   (2004-10-08 01:47:00) [25]

GuAV ©   (08.10.04 01:35) [1]
> Читать при этом так:
> ReadBuffer(I, SizeOf(I));
> SetLength(S, I)


это, а к ShortString разве тоже можно применять SetLength? Помоему это статиский массив, не нужен там SetLength.


GuAV   (2004-10-08 01:35:00) [26]


> with TFileStream.Create('MyArray.dat', fmCreate or fmOpenWrite)
> do begin
> WriteBuffer(a, SizeOf(a));
> Free;
> Но, я не знаю, как его потом из файла прочитать

Из такого файла можно будет прочитать эту переменную, однако от этого много пользы не будет. Видите ли, string - это на самом деле указатель на содержимое строки. При чтении прочитается указатель, но не содержимое, которое не было записано. Указатели потом будут указывать на левые данные и манипуляции с ними опасны...

Самый простой выход shortstring заместо string.
Можно ещё писать сначала длинну строки
I:=Length(S);
WriteBuffer(I, SizeOf(I));
а потом саму
WriteBuffer(S[1], I);
Читать при этом так:
ReadBuffer(I, SizeOf(I));
SetLength(S, I)
ReadBuffer(S[1], I);


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо