Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Daten aus großen Binärdateien lesen (https://www.delphipraxis.net/22944-daten-aus-grossen-binaerdateien-lesen.html)

trid 26. Mai 2004 16:53


Daten aus großen Binärdateien lesen
 
Hallo Wissende,

ich habe folgendes Problem:

Ich will aus einer ca. 10MB großen Binärdatei der Reihe nach alle Daten lesen, konvertieren und in einem Textfile abspeichern.
Funktioniert auch soweit ganz gut, nur....

wenn ich mit

while not eof(SourceFile)

auf das ende hin prüfe, bricht das programm immer nach genau 835168 gelesenen bytes ab.

lasse ich diese Prüfung weg, bricht er zwar nicht ab, liest aber nur noch $1A.

Hat jemand IRGENDEINE Idee, wie das zu verhindern ist.

ich benutze im groben folgendes Konstrukt:

AssignFile(SourceFile,OpenDialog1.FileName);
Reset(SourceFile);

while not eof(SourceFile)....
read(SourceFile, lb);


Für Ideen und Anregungen im Vorraus vielen Dank

The-X 26. Mai 2004 18:00

Re: Daten aus großen Binärdateien lesen
 
1. Binärdateien liest man normalerweise nicht mit read(f,bytevar); sondern mit wie folgt

Delphi-Quellcode:
Procedure ConvertFiles(Var Source,Dest:String);
Var Fsource,FDest:File;
    bRead,bWrit:Integer;
    i:Integer;
    Buf:Array[0..1023]of Byte;
Begin
 AssignFile(FSource,Source);Filemode:=FmOpenRead;Reset(Fsource,1); //Quell-Datei lesen
 AssignFile(FDest,Dest);Filemode:=FmOpenWrite;Rewrite(FDest,1); //Ziel-Datei erstellen

 Repeat
  BlockRead(FSource,Buf,Sizeof(buf),bRead);
  For I:=0 to bRead do buf[i]:=buf[i] xor 255; // "Konvertierung"
  BlockWrite(FDest,Buf,bRead,Bwrit);
 Until (bread=0) or (bRead<>bWrit);

 CloseFile(FDest);
 CloseFile(FSource);
end;
^^ (Splatter-Source... nur zur Verdeutlichung, Keine Laufgarantie !!!)

Wenn du mit Typisierten Dateien Arbeitest bricht Eof beim ersten Aufkommen von $1A auf zu lesen
($1A war/ist das Hier-ist-die-Datei-zuEnde-Zeichen)
daher bei Binär Dateien besser mit Blockread/Write arbeiten .. ;)

wenn du als Ausgabe eine Textdatei hast kannst du aus FDest eine TextFile machen und wie gehabt mit Write[ln]/Read[ln] arbeiten...

trid 26. Mai 2004 18:04

Re: Daten aus großen Binärdateien lesen
 
Danke für die schnelle Antwort, habs gerade rausgefunden, als ich sah, daß dann auch nur noch $1A gelesen wird. :wall:

Matze 27. Mai 2004 08:36

Re: Daten aus großen Binärdateien lesen
 
:hi: trid

Bitte entferne den Hinweis, dass es sich um eine offene Frage handelt, da diese ja nun gelöst ist. Danke. ;)

generic 27. Mai 2004 09:57

Re: Daten aus großen Binärdateien lesen
 
warum arbeitet hier bei dp niemand mit tfilestream ?

Stevie 27. Mai 2004 10:05

Re: Daten aus großen Binärdateien lesen
 
Zitat:

Zitat von generic
warum arbeitet hier bei dp niemand mit tfilestream ?

Ich tu's... :roll: Aber es hat halt beides seine Vorteile

The-X 27. Mai 2004 14:07

Re: Daten aus großen Binärdateien lesen
 
Der TFileStream hat AFAIK einen entscheidenden Nachteil... er lädt zuerst die komplette Datei in den Speicher bevor man damit arbeiten kann... was bei der AssignFile-Variante nicht der Fall ist...
Es werden nur die Bytes gelesen die man wirklich braucht.
(habe das mal bei einem MP3-Tag-Demo festgestellt...
TFileStream.Seek dauerte bei einer 15Mb Datei etwa 3-4 mal so lange wie ein AssignFile/Seek/Blockread-Konstrukt (unter gleichen Bedinungen ... habe jeweils voher neugestartet)
und das bei der gleichen Datei)

ein Vorteil von TFileStream scheint mir die Fehlerüberprüfung zu sein welche man bei AssignFile u.a. komplett selber implementieren muss.

Christian Seehase 27. Mai 2004 16:21

Re: Daten aus großen Binärdateien lesen
 
Moin The-X,

Zitat:

Zitat von The-X
TFileStream.Seek dauerte bei einer 15Mb Datei etwa 3-4 mal so lange wie ein AssignFile/Seek/Blockread-Konstrukt (unter gleichen Bedinungen ... habe jeweils voher neugestartet)
und das bei der gleichen Datei)

:shock:

Beide Seek Routinen greifen intern auf die API SetFilePointer zu.
Das TFileStream etwas langsamer ist kann ich mir noch vorstellen (Overhead wg. Objekt), aber so. :gruebel:

Was heisst 3-4 mal so lange absolut?

The-X 30. Mai 2004 14:18

Re: Daten aus großen Binärdateien lesen
 
ich meinte damit das Auslesen des Id3Tags bei der 15Mb-Datei...

ohne TFileStream dauerte das reine Auslesen knapp eine Sekunde,
mit TFileStream etwa 3-4 Sekunden da, wie ich vermute, zuerst die komplette Datei in den Speicher gelesen wird bevor die Open/Create-Funktion endet :roll:

und das ist für mich ein Grund keine TFileStreams zu nutzen wenn es sich irgendwie vermeiden lässt


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:25 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