AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Zeilen von einem Stream lesen

Ein Thema von danieleh · begonnen am 26. Dez 2008 · letzter Beitrag vom 27. Dez 2008
Antwort Antwort
danieleh

Registriert seit: 1. Dez 2005
54 Beiträge
 
#1

Zeilen von einem Stream lesen

  Alt 26. Dez 2008, 12:02
Hallo
Ich benutze momentan die Methode von Hawkeye219 im Beitrag: http://www.delphipraxis.net/internal...tfilestreamext
um Strings (von einem Memo) in einen Stream zu lesen/schreiben.

Frage: wie kann man einzelne Zeilen direkt aus dem Stream lesen ? (ohne den Umweg über den gesamten Stream in ein Memo zu laden)

Wäre sehr Dankbar für Eure Hilfe.
Daniele
  Mit Zitat antworten Zitat
andreash

Registriert seit: 22. Jun 2006
Ort: Dörverden
60 Beiträge
 
Delphi 7 Professional
 
#2

Re: Zeilen von einem Stream lesen

  Alt 26. Dez 2008, 13:56
Hallo,

ich habe gerade gestern mit Streams als Textfile experimentiert. Hier mein erster Versuch. Einfach eine Variable vom Typ Textfile mit dem gewünschtem Stream mit StreamFile.AssignFile initialisieren und mit Reset öffnen, dann geht es gewohnt weiter mit Readln und Eof.

Delphi-Quellcode:
unit StreamFile;
interface
Uses
  Classes, SysUtils;
  
Procedure AssignFile(Var f: Textfile; Stream: TStream);

implementation

function FileNOPProc(var t): Integer;
begin
  Result := 0;
end;

function TextStreamIn(var t: TTextRec): Integer;
Var
  S: TStream;
Begin
  t.BufEnd := 0;
  t.BufPos := 0;
  Move(t.UserData, S, SizeOf(TObject));
  t.BufEnd := S.Read(t.BufPtr^, t.BufSize);
  Result := 0;
End;

Function TextStreamOut(Var t: TTextRec): Integer;
Var
  S: TStream;
Begin
  Move(t.UserData, S, SizeOf(TObject));
  If S.Write(t.BufPtr^, t.BufPos) = t.BufPos Then
    Result := 0
  Else
    Result := 103;
  t.BufPos := 0;
End;

Function TextStreamOpen(Var t: TTextRec): Integer;
Var
  Mode: Integer;
Begin
  Mode := (fmInput and 3);
  Result := 0;
  t.BufPos := 0;
  t.BufEnd := 0;
  t.FlushFunc := @FileNOPProc;
  t.CloseFunc := @FileNOPProc;
  If Mode = (t.Mode and 3) then
  Begin
    t.InOutFunc := @TextStreamIn;
  End Else
  Begin
    t.InOutFunc := @TextStreamOut;
  End;
End;

Procedure AssignFile(Var f: Textfile; Stream: TStream);
Var
  t: TTextRec absolute f;
begin
  FillChar(t, sizeof(TFileRec), 0);
  t.BufPtr := @t.Buffer;
  t.Mode := fmClosed;
  t.Flags := tfCRLF * Byte(DefaultTextLineBreakStyle);
  t.BufSize := sizeof(t.Buffer);
  t.OpenFunc := @TextStreamOpen;
  Move(Stream, t.UserData, SizeOf(TObject));
  StrPCopy(t.Name, 'Stream');
end;

end.
Andreas
Der Optimist glaubt, wir leben in der besten aller möglichen Welten. Der Pessimist befürchtet, daß das stimmt.
  Mit Zitat antworten Zitat
danieleh

Registriert seit: 1. Dez 2005
54 Beiträge
 
#3

Re: Zeilen von einem Stream lesen

  Alt 27. Dez 2008, 09:46
Hallo Andreas,
besten Dank für deinen Code.
Es ist mir allerdings nicht ganz klar wie man diesen einsetzt um bestimmte Zeilen aus dem Stream zu lesen. Ich schreibe und speichere ein Memo in ein Filestream. Danach möchte ich lediglich einzelne Zeilen daraus lesen (zb. Zeile 5).

Gruss
Daniele
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.755 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: Zeilen von einem Stream lesen

  Alt 27. Dez 2008, 10:03
Guten Morgen Daniele,

was spricht dagegen, den Stream in eine StringList zu laden
und dort die gewünschte Zeile auszulesen.

Du mußt sowieso im worst case fast den ganzen Stream durchsuchen
um eine Zeile am Ende des Streams zu extrahieren.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#5

Re: Zeilen von einem Stream lesen

  Alt 27. Dez 2008, 10:05
Random Access, also "wahlfreier Zugriff" ist ohne selbstgebaute Logik nicht möglich. Du musst die ersten 4 Zeilen auslesen, um dann die 5.Zeile zu bekommen. Das liegt daran, das die Zeilen unterschiedlich lang sind.

Du könntest Dir eine Methode basteln, die zur n.ten Zeile hüpft, indem Du nur die Längeninformation ausliest und anschließend die entsprechende Byteanzahl nach vorne wanderst (per 'Seek').
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.139 Beiträge
 
Delphi 12 Athens
 
#6

Re: Zeilen von einem Stream lesen

  Alt 27. Dez 2008, 11:12
Wenn es nicht darauf ankommt die Xte Zeile zu lesen, sondern die Zeile an Position XYZ, dann könnte man auch einfach zu dieser Position springen, dann rückwärts den Zeilenanfang suchen und ab da diese Zeile auslesen.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
danieleh

Registriert seit: 1. Dez 2005
54 Beiträge
 
#7

Re: Zeilen von einem Stream lesen

  Alt 27. Dez 2008, 15:08
Hallo Alle

Vielen Dank für Eure Beiträge. Es ist, wie ich befürchtet habe, nicht ganz trivial was ich vor hatte.
Deswegen ist der Ansatz von Klaus vielleicht doch der Beste in meinem Fall.

Liebe Grüße
Daniele
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:07 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz