![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Чтение/запись строк в поток
Torin © (2004-11-19 11:15:00)Как можно писать/читать строки (тип String) из потока, например, TFileStream?
Torin (2004-11-19 11:44:00) [1]Всем спасибо.
TUser именно таким образом я и читал, но мне кажется что это довольно медленно.
Smithson в случае если SetLength(S, I+1); в конце строки появляется лишний символ
Кириешки (2004-11-19 11:25:00) [2]
{ загрузка }
procedure LoadList(Listname : TListbox; Filename : pchar);
var
FileStream: TFileStream;
Reader: TReader;
begin
if FileExists(Filename) then
begin
FileStream := TFileStream.Create(Filename, fmOpenRead);
try
Reader := TReader.Create(FileStream, $FF);
try
Reader.ReadListBegin;
Listname.items.Clear;
while not Reader.EndOfList do
Listname.items.Add(Reader.ReadString);
Reader.ReadListEnd;
finally
Reader.Free;
end;
finally
FileStream.Free;
end;
end;
end;
{ сохранение }
procedure SaveList(Listname : TListbox; Filename : pchar);
var
FileStream: TFileStream;
Writer: TWriter;
I: Integer;
begin
FileStream := TFileStream.Create(Filename, fmCreate or fmOpenWrite or fmShareDenyNone);
try
Writer := TWriter.Create(FileStream, $FF);
try
Writer.WriteListBegin;
for I := 0 to Listname.items.Count - 1 do
Writer.WriteString(Listname.items[I]);
Writer.WriteListEnd;
finally
Writer.free;
end;
finally
FileStream.free;
end;
end;
Вместо Listname : TListbox можно ставить что угодно, главное заменить в процедуре тип.
TUser (2004-11-19 11:22:00) [3]ReadBuffer/WriteBuffer + F1
Требуется еще знать длину сторки, поэтому обычно делают например так
procedure WriteString(S:string);
var c:integer;
ch:char;
begin
c:=length(S);
Stream.WriteBuffer(c,sizeof(integer));
for c:=c downto 1 do begin
ch:=S[c];
Stream.WriteBuffer(ch,1);
end;
end;
function ReadString:string;
var c:integer;
p:integer;
ch:char;
begin
try
p:=Stream.Position;
result:='';
Stream.ReadBuffer(c,sizeof(integer));
for c:=c downto 1 do begin
Stream.ReadBuffer(ch,1);
result:=ch+result;
end;
except
Stream.Position:=p;
result:='Unable to read';
end;
end;
Smithson (2004-11-19 11:19:00) [4]Элементарно. Гдавное, помнить, что строка в Delphi - это указатель и работать с ней надо соответственно:
// Запись
S := 'Test string for stream;
i := Length(S);
F.Write(i, SizeOF(I));
F.Write(S[1], Length(S));
// Чтение
F.Read(I, SizeOF(I));
SetLength(S, I+1);
F.Read(S[1], I);