AGB  ·  Datenschutz  ·  Impressum  







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

Datei byteweise einlesen

Ein Thema von CalganX · begonnen am 11. Mai 2009 · letzter Beitrag vom 13. Mai 2009
Antwort Antwort
Seite 1 von 2  1 2      
CalganX

Registriert seit: 21. Jul 2002
Ort: Bonn
5.403 Beiträge
 
Turbo Delphi für Win32
 
#1

Datei byteweise einlesen

  Alt 11. Mai 2009, 10:27
Hallo zusammen,

da ich ziemlich aus der Übung gekommen bin, was Delphi angeht, frage ich lieber noch mal nach, bevor ich mich ins Getümmel stürze.

Ich habe eine Datei in einem proprietären Format. Die Beschreibung des Aufbaus habe ich vollständig dokumentiert vorliegen. Die Frage ist jetzt, wie ich mit Delphi eine Datei (die übrigens mit einem C-Programm zusammengestellt wurde) byteweise auslese. D.h. wenn ich jetzt in der Dokumentation stehen habe, dass dort ein 4-Byte-Wert folgt, will ich auch entsprechend auslesen.
Dass das mit readln(); geht, kann ich mich noch erinnern und das ist ja auch entsprechend in der Hilfe dokumentiert.
Gibt es noch einen anderen Weg. Und was ist der eleganteste, schönste und einfachste Weg?

Gruß
Christopher
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Datei byteweise einlesen

  Alt 11. Mai 2009, 10:31
Ich würde dir die Verwendung von TFileStream empfehlen. Entsprechend dann die Read-Methode
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Klaus01

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

Re: Datei byteweise einlesen

  Alt 11. Mai 2009, 10:34
.. die Dokumentation des Formats hast Du vorliegen,
warum baust Du dir dann keinen Record um die Datei datensatzsweise
zu lesen?

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von Mithrandir
Mithrandir
(CodeLib-Manager)

Registriert seit: 27. Nov 2008
Ort: Delmenhorst
2.379 Beiträge
 
#4

Re: Datei byteweise einlesen

  Alt 11. Mai 2009, 10:37
ReadLN würde ich in diesem Falle nicht benutzen, wenn es sich nicht um ein PlainText-Format handelt. Ein falsches Zeichen, und schwupp die wuppdi ist es vorbei.

Mal n Copy&Waste:

Delphi-Quellcode:
    
const
  BUF_SIZE = 1024000; //1 MB

fXMLStream := TFileStream.Create(fFilePath, fmOpenRead or fmShareDenyNone);

while not Terminated do begin
      fsBuf := StringOfChar(#00, BUF_SIZE);
      i := fXMLStream.Read(fsBuf[1], BUF_SIZE);
{Mach was mit dem Buffer }
      Finalize(fsBuf);
      if i <> BUF_SIZE then
        Terminate;
end;
米斯蘭迪爾
"In einer Zeit universellen Betruges wird das Aussprechen der Wahrheit zu einem revolutionären Akt." -- 1984, George Orwell
  Mit Zitat antworten Zitat
CalganX

Registriert seit: 21. Jul 2002
Ort: Bonn
5.403 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Datei byteweise einlesen

  Alt 11. Mai 2009, 11:32
Hallo,

ja, prima. Ich nehme den FileStream. Damit kann ich gut arbeiten.

Danke!
Christopher
  Mit Zitat antworten Zitat
Benutzerbild von Meflin
Meflin

Registriert seit: 21. Aug 2003
4.856 Beiträge
 
#6

Re: Datei byteweise einlesen

  Alt 11. Mai 2009, 11:33
Zitat von Klaus01:
warum baust Du dir dann keinen Record um die Datei datensatzsweise
zu lesen?
Und wie ginge das
  Mit Zitat antworten Zitat
Benutzerbild von Mithrandir
Mithrandir
(CodeLib-Manager)

Registriert seit: 27. Nov 2008
Ort: Delmenhorst
2.379 Beiträge
 
#7

Re: Datei byteweise einlesen

  Alt 11. Mai 2009, 11:37
Vermutlich mit typisierten Dateien und allem drumherum. Man muss halt nur schauen, dass man Typen findet, die zur Definition passen.
米斯蘭迪爾
"In einer Zeit universellen Betruges wird das Aussprechen der Wahrheit zu einem revolutionären Akt." -- 1984, George Orwell
  Mit Zitat antworten Zitat
mr_emre_d
(Gast)

n/a Beiträge
 
#8

Re: Datei byteweise einlesen

  Alt 11. Mai 2009, 11:44
Delphi-Quellcode:
var
  F: File of Byte;
  X: Array of Byte;
begin
  AssignFile( F, '<Path>' );
  // Falls Datei existiert, dann öffnen und FilePointer reseten
  Reset( F );
  // und wenn nicht, dann erstellen + öffnen usw ..
  Rewrite( F );
  
  SetLength( X, FileSize( F ) );
  // lesen:
  BlockRead( F, X[0], Length(X) );
  // schreiben
  BlockWrite( F, X[0], Length(X) );

  // Filepointer setzen:
  Seek( F, 0 );

  // Anschließend schließen - falls etwas geändert wurde, wirds gespeichert
  CloseFile( F );
end;
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#9

Re: Datei byteweise einlesen

  Alt 11. Mai 2009, 17:45
man kann auch mit TFileStream Records einlesen. Anstelle eines Stringbuffers eben einfach eine Recordvariable verwenden.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von stoxx
stoxx

Registriert seit: 13. Aug 2003
1.111 Beiträge
 
#10

Re: Datei byteweise einlesen

  Alt 12. Mai 2009, 13:03
wenn die gelesene blockgröße gleich der zu lesenden Recordgröße ist, sind die beschriebenen Methoden sehr, sehr langsam. Um viele Faktoren.
Der zu verwendente Lesepuffer sollte bei heutigen Festplatten schon sehr groß sein, 64 kb ist eine angenehme Größe.
Deshalb sollte man also mit einer großen Buffersize lesen und dann müsste man noch umständlich diesen Großen Block auf mehrere Deiner Records aufteilen. Bei diesem Verfahren sollte dann zusätzlich noch die zu lesende Buffersize ein Vielfaches der zu lesenden RecordSize sein, damit es keine Überschneidungen an den Blockgrenzen geben kann, in diesem Falle wird es dann nämlich noch komplizierter.

Das alles kann man sehr einfach haben und sich das nachdenken sparen, wenn man eine Kombination aus TFilestream und TReader verwendet. TReader kann das alles schon selbst.

also quasi sowas:

Delphi-Quellcode:
const
  BufferSize = $10000; // 65536; 64 kb


function LoadFromFile(const aFileName : String) :Integer;
var
  f : TFileStream;
  r : TReader;
  i : Integer;
  myRecord : TMyRecord;
  recSize : Integer;
begin
  Result:=0;
  recSize := SizeOf(TMyRecord);
  f:=TFileStream.Create( aFilename , fmOpenRead or fmShareDenyWrite);
  try
    r:=TReader.Create(f ,BufferSize);
    try

      for i:=0 to (f.Size Div recSize) -1 do
        r.Read(myRecord , recSize );

        ... // myRecord verarbeiten

        Inc(Result);
      end;
    finally
      r.Free;
    end;
  finally
    f.Free;
  end;
end;
siehe hier nochmal auch: http://delphi.pjh2.de/articles/files/files.php
Phantasie ist etwas, was sich manche Leute gar nicht vorstellen können.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 09:15 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