AGB  ·  Datenschutz  ·  Impressum  







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

Datei mit FileStream auslesen

Ein Thema von delphinewbie · begonnen am 27. Aug 2010 · letzter Beitrag vom 10. Sep 2010
Antwort Antwort
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#1

AW: Datei mit FileStream auslesen

  Alt 31. Aug 2010, 16:50
Musst du die Datei bloss einlesen oder muss die Datei später auch verändert geschrieben werden?
Falls die Datei nur gelesen werden muss, könntest du Dir viel Arbeit sparen, wenn du eine Adapterklasse einsetzt.

Hier mal als Vergleich zwischen deiner alten Technik und meinem neuen Vorschlag:
Delphi-Quellcode:
Read(ds.FileID,sizeof(word)); // ALT
ds.FileID := h.ReadWord; // NEU

// ALT - 3 Zeilen
Read(ds.string_length_comment[i],sizeof(word));
Setlength(ds.string_comment[i], ds.string_length_comment[i]);
Read(ds.string_comment[i][1],ds.string_length_comment[i]);

// NEU - nur eine Zeile
ds.string_length_comment[i] := h.ReadShortString;
Beim Einlesen eines Words ist der Unterschied noch recht gering,
aber beim Einlesen von den Strings zeigt sich doch, dass die neue Technik viel angenehmer ist.

Ausserdem kannst du Dir damit sämtliche Längenangaben in dem Record sparen
und dich voll auf die Nutzdaten konzentrieren.

Hier wäre mal die Deklaration der Adapterklasse:
Delphi-Quellcode:
  TStreamAdapter = class(TObject)
  protected
    FStream : TStream;
  public
    constructor Create(AStream:TStream;AOwnsStream: Boolean = False);
    destructor Destroy;override;
    function ReadBoolean: Boolean;
    function ReadChar: Char;
    function ReadCurrency: Currency;
    function ReadDateTime: TDateTime;
    function ReadDouble: Double;
    function ReadExtended: Extended;
    function ReadInt64: Int64;
    function ReadInteger: Integer;
    function ReadCString: string;
    function ReadShortString: string;
    function ReadSingle: Single;
    function ReadSizedString: string;
    function ReadWord:Word;
    procedure WriteBoolean(Value: Boolean);
    procedure WriteChar(Value: Char);
    procedure WriteCurrency(const Value: Currency);
    procedure WriteDateTime(const Value: TDateTime);
    procedure WriteDouble(const Value: Double);
    procedure WriteExtended(const Value: Extended);
    procedure WriteInt64(Value: Int64); overload;
    procedure WriteInteger(Value: Integer); overload;
    procedure WriteStringDelimitedByNull(const Value: string);
    procedure WriteShortString(const Value: ShortString);
    procedure WriteSingle(const Value: Single);
    procedure WriteSizedString(const Value: string);
    procedure WriteWord(const Value:Word);
  end;
Bei Interesse kann ich dir noch mehr zu der Adapterklasse schreiben.
Andreas

Geändert von shmia (31. Aug 2010 um 16:54 Uhr)
  Mit Zitat antworten Zitat
delphinewbie

Registriert seit: 27. Aug 2010
47 Beiträge
 
#2

AW: Datei mit FileStream auslesen

  Alt 2. Sep 2010, 06:42
Hi shmia,
vielen Dank für deinen Vorschlag. Ja, die Datei muss nur ausgelesen werden. Veränderungen daran sind sogar unerwünscht !!!
Muss leider zugeben, dass ich mit Adapterklassen nichts anfangen kann, da ich ja auch erst anfange, mich mit delphi zu beschäftigen. Eins ist mir jedoch an deinem Beispiel aufgefallen :
Delphi-Quellcode:
// NEU - nur eine Zeile
ds.string_length_comment[i] := h.ReadShortString;
Ich lese doch eigentlich zwei Werte aus: 1. Länge der folgenden Zeichenkette - 2. Zeichenkette selbst

Bei dir in der einen Zeile kann ich aber nur erkennen, dass die Länge der Zeichenkette ausgelesen wird. Mir ist jetzt nicht klar, wie deine eine Zeile meine drei Zeilen ersetzt.

Auch wenn ich mir dadurch 'ne Menge Arbeit ersparen würde, stellt sich mir aber die Frage, ob damit der Fehler behoben wäre, der nach jedem Programmende auftritt.
Ich gehe bisher davon aus, dass das Auslesen der Datei richtig funktioniert, weil auch die korrekten Kurven usw. entstehen. Nur muss halt danach noch etwas unsauber programmiert sein (fehlende Speicherfreigaben oder ungültige Speicherbereiche...)
Ich habe die Hoffnung noch nicht aufgegeben, das Problem zu lösen und setze auch weiterhin ganz stark auf euer immenses Wissen
Tschüß und
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Datei mit FileStream auslesen

  Alt 2. Sep 2010, 07:00
Er meinte es wohl eher so
ds.string_comment[i] := h.ReadShortString; .
bzw. so
Delphi-Quellcode:
ds.string_comment[i] := h.ReadShortString;
ds.string_length_comment[i] := Length(ds.string_comment);
Das ReadShortString ließt wohl das LängenByte aus und darauf folgend entsprechend viele Bytes/AnsiZeichen in einen String, welcher dann zurückgegeben wird.


PS: Nur um die Verwirrungen komplett zu machen.
Man ließt hier eine feste Anzahl an Byte in einen String,
nur daß ab Delphi 2009 der String ein UnicodeString ist und somit jedes Zeichen darin 2 Byte groß wäre.
Und dann behaupte man wieder ich hätte nie davor gewarnt, daß man keine generischen Typen (wie den String) mit festen ByteGrößen gleichsetzen soll.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 2. Sep 2010 um 07:05 Uhr)
  Mit Zitat antworten Zitat
delphinewbie

Registriert seit: 27. Aug 2010
47 Beiträge
 
#4

AW: Datei mit FileStream auslesen

  Alt 2. Sep 2010, 08:54
Hi,
das würde heißen, wenn ich die Stringlänge eigentlich nicht weiter benötige, genügt diese Zeile

ds.string_comment[i] := h.ReadShortString; ?

Funzt das nur, wenn die Stringlänge in einem Byte steht ? Was ist, wenn die Länge aber in 2 Bytes steht, wie bei mir ?

L_of_Filecomment : word;
Filecomment : string;

Zitat:
PS: Nur um die Verwirrungen komplett zu machen.
Das hat auf jeden Fall geklappt !!!

Ich glaube, ich laß lieber die Finger davon... Es muss auch mit FileStream gehen, wenn auch mit etwas mehr Aufwand.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Datei mit FileStream auslesen

  Alt 2. Sep 2010, 09:16
Funzt das nur, wenn die Stringlänge in einem Byte steht ? Was ist, wenn die Länge aber in 2 Bytes steht, wie bei mir ?
Wenn diese Funktion so erstellt wurde, daß sie mit 2 Byte als Länte arbeitet, dann kann man es auch nehmen.

Und genau deswegen hatte ich doch schonmal gefragt.
Diese 2 Byte sind auch in der Datei vorhanden und nicht nur in der Record-Deklaration?

Nja, selbst wenn du die länge selber ausließt, muß sie nicht unbegingt mit in dem Record drinstehn.

Ich glaube, ich laß lieber die Finger davon... Es muss auch mit FileStream gehen, wenn auch mit etwas mehr Aufwand.
Auch bei dem FileStream mußt du aufpassen.
Deklariere einfach deine Strings als AnsiString und gut ist.

Du kannst gerne mal so ab etwa hier ( http://www.delphipraxis.net/154168-n...ml#post1046616 ) dir die unicode- und integerbezogenen Postings durchlesen.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 2. Sep 2010 um 09:22 Uhr)
  Mit Zitat antworten Zitat
delphinewbie

Registriert seit: 27. Aug 2010
47 Beiträge
 
#6

AW: Datei mit FileStream auslesen

  Alt 2. Sep 2010, 10:28
Jawoll,
diese zwei Bytes sind in der Datei vorhanden. Ich muss immer wieder darauf hinweisen : Das Auslesen der Datei funktioniert. Wäre die Dateilänge bspw. nur in einem Byte abgelegt statt wie von mir angenommen in zweien, müßte es doch bei der Darstellung der Daten (z.B. in einer Tabelle) ein riesen Durcheinander geben. Zusätzlich habe ich noch den Vergleich mit einer Textdatei, die durch das Programm, mit dem die Messwerte gewonnen werden aus der Binärdatei konvertiert wird. Und ich muss sagen, dass ich hier eine exakte Übereinstimmung feststellen kann.
Nun werde ich trotzdem mal auf AnsiString umstellen, vllt. bewirkt es ja was....
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#7

AW: Datei mit FileStream auslesen

  Alt 2. Sep 2010, 12:31
Entschuldigt,
aber wenn ich soetwas als Beschreibung von Daten in einer Datei lese, fühle ich mich doch sehr unwohl:
formula : array[1..255] of string; was verbirgt sich hinter "String"?
Handelt es sich um den "klassischen" Pascal-String Längenbyte,Nutzdaten[1]..Nutzdaten[längenbyte] oder ist es ein LängenWort(16Bit)/(32Bit), sind für jeden String 255 Bytes reserviert oder sind die Längenangaben/Strings mit oder ohne Trennzeichen hintereinander "geklatscht"??????
Unicode und 16Bit-Chars sparen wir uns einmal.

Und dann gibt es noch die Frage ob die Zahlen Leastsignifikant (Intel) gespeichert wurden, denn wenn dies nicht der Fall ist, dann kann man kein Word/Integer oder was auch immer sondern nur Bytes lesen, die dann erst einmal "richtig" sortiert werden müssen.

(Falls man das Format einer Datei nicht genau kennt, dann geht kein Weg an Filestream vorbei)

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  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 05:04 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz