Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.081 c
1-1100965289
Evgeny
2004-11-20 18:41
2004.12.05
Решение задач


14-1100790753
DiamondShark
2004-11-18 18:12
2004.12.05
...чтоб сказку сделать былью.


8-1094317882
hamster
2004-09-04 21:11
2004.12.05
*.ogg


1-1101197715
Max Ivanych
2004-11-23 11:15
2004.12.05
Как изменить цвет шрифта в StringGrid?


1-1100672355
Azazello
2004-11-17 09:19
2004.12.05
Выделение ячейки в StringGrid





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский