Главная страница
    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.038 c
3-1099457896
KisaNetik
2004-11-03 07:58
2004.12.05
Вопрос по SQL при обновлении записи


1-1101137093
hgd
2004-11-22 18:24
2004.12.05
Подскажите


1-1100772746
CCCP
2004-11-18 13:12
2004.12.05
Эскизы страниц


14-1100522633
DiamondShark
2004-11-15 15:43
2004.12.05
Есть предложение.


4-1098298181
Cheburek
2004-10-20 22:49
2004.12.05
Drag&Drop элементов из проводника в моё приложение





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский