![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Массив в файл [D5, WinXP]
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);