Форум: "Основная";
Текущий архив: 2004.12.05;
Скачать: [xml.tar.bz2];
ВнизЧтение/запись строк в поток Найти похожие ветки
← →
Torin (2004-11-19 11:15) [0]Как можно писать/читать строки (тип String) из потока, например, TFileStream?
← →
Smithson (2004-11-19 11:19) [1]Элементарно. Гдавное, помнить, что строка в 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);
← →
TUser © (2004-11-19 11:22) [2]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;
← →
Кириешки © (2004-11-19 11:25) [3]
{ загрузка }
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 можно ставить что угодно, главное заменить в процедуре тип.
← →
Torin (2004-11-19 11:44) [4]Всем спасибо.
TUser именно таким образом я и читал, но мне кажется что это довольно медленно.
Smithson в случае если SetLength(S, I+1); в конце строки появляется лишний символ
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.12.05;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.054 c