Главная страница
    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.034 c
1-1100954265
xkiller
2004-11-20 15:37
2004.12.05
Когда PopupMenu раскрыто то OnMouseMove и OnMouseEnter неработают


14-1100520555
clickmaker
2004-11-15 15:09
2004.12.05
Дельфи-программер - бесперспективная профессия?


1-1101107443
ruslan_as
2004-11-22 10:10
2004.12.05
Как правильно прервать работу процедуры...


4-1098253544
Koala
2004-10-20 10:25
2004.12.05
Вопрос по передачи файла с помощью модема


3-1099916303
denis24
2004-11-08 15:18
2004.12.05
изменение записей в гриде





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