Вниз
Скачать: CL | DM;

Чтение/запись строк в поток   Найти похожие ветки 

← →
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 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.023 c
9-1084546612
Omar2002
2004-05-14 18:56
2004.12.05
Статистическое предсказывание.


6-1096118529
Шишкин Илья
2004-09-25 17:22
2004.12.05
Как определить, доступен ли компьютер в LAN


3-1099648336
vvv
2004-11-05 12:52
2004.12.05
MasterSource-MasterField


8-1094490378
Klopan
2004-09-06 21:06
2004.12.05
mp3 player в DOS


14-1100507542
Гайцы-Газазад
2004-11-15 11:32
2004.12.05
Украина - Турция. 17 ноября 2004 года.




   Наверх