Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.12.05;
Скачать: 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 вся ветка

Текущий архив: 2004.12.05;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.047 c
1-1101302963
Саша
2004-11-24 16:29
2004.12.05
Макроподстановка


14-1099934350
ИМХО
2004-11-08 20:19
2004.12.05
Почему Шевченко велик в Милане и невелик в сборной?


14-1100776312
Pentium133
2004-11-18 14:11
2004.12.05
Знатоки CVS


1-1101033146
Morj
2004-11-21 13:32
2004.12.05
Глюк Win2k


3-1099983334
SDA
2004-11-09 09:55
2004.12.05
Что такое методы асинхронного коннекта???