AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Daten aus großen Binärdateien lesen
Thema durchsuchen
Ansicht
Themen-Optionen

Daten aus großen Binärdateien lesen

Offene Frage von "trid"
Ein Thema von trid · begonnen am 26. Mai 2004 · letzter Beitrag vom 30. Mai 2004
Antwort Antwort
trid

Registriert seit: 10. Mai 2004
5 Beiträge
 
#1

Daten aus großen Binärdateien lesen

  Alt 26. Mai 2004, 17:53
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
  Mit Zitat antworten Zitat
Benutzerbild von The-X
The-X

Registriert seit: 31. Aug 2003
Ort: Woffelsbach / user.exe ;)
377 Beiträge
 
Delphi 7 Personal
 
#2

Re: Daten aus großen Binärdateien lesen

  Alt 26. Mai 2004, 19:00
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...
WGET ftp://root@fbi.us.gov/secret/worldreign.exe <- damit werde ich die Weltherrschaft an mich reissen!
=> irc://irc.quakenet.eu.org:6667/delphi.de da werden Sie auch (manchmal) geholfen
  Mit Zitat antworten Zitat
trid

Registriert seit: 10. Mai 2004
5 Beiträge
 
#3

Re: Daten aus großen Binärdateien lesen

  Alt 26. Mai 2004, 19:04
Danke für die schnelle Antwort, habs gerade rausgefunden, als ich sah, daß dann auch nur noch $1A gelesen wird.
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Daten aus großen Binärdateien lesen

  Alt 27. Mai 2004, 09:36
trid

Bitte entferne den Hinweis, dass es sich um eine offene Frage handelt, da diese ja nun gelöst ist. Danke.
  Mit Zitat antworten Zitat
generic

Registriert seit: 24. Mär 2004
Ort: bei Hannover
2.416 Beiträge
 
Delphi XE5 Professional
 
#5

Re: Daten aus großen Binärdateien lesen

  Alt 27. Mai 2004, 10:57
warum arbeitet hier bei dp niemand mit tfilestream ?
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.016 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#6

Re: Daten aus großen Binärdateien lesen

  Alt 27. Mai 2004, 11:05
Zitat von generic:
warum arbeitet hier bei dp niemand mit tfilestream ?
Ich tu's... Aber es hat halt beides seine Vorteile
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Benutzerbild von The-X
The-X

Registriert seit: 31. Aug 2003
Ort: Woffelsbach / user.exe ;)
377 Beiträge
 
Delphi 7 Personal
 
#7

Re: Daten aus großen Binärdateien lesen

  Alt 27. Mai 2004, 15:07
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.
WGET ftp://root@fbi.us.gov/secret/worldreign.exe <- damit werde ich die Weltherrschaft an mich reissen!
=> irc://irc.quakenet.eu.org:6667/delphi.de da werden Sie auch (manchmal) geholfen
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#8

Re: Daten aus großen Binärdateien lesen

  Alt 27. Mai 2004, 17:21
Moin The-X,

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)


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.

Was heisst 3-4 mal so lange absolut?
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von The-X
The-X

Registriert seit: 31. Aug 2003
Ort: Woffelsbach / user.exe ;)
377 Beiträge
 
Delphi 7 Personal
 
#9

Re: Daten aus großen Binärdateien lesen

  Alt 30. Mai 2004, 15:18
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

und das ist für mich ein Grund keine TFileStreams zu nutzen wenn es sich irgendwie vermeiden lässt
WGET ftp://root@fbi.us.gov/secret/worldreign.exe <- damit werde ich die Weltherrschaft an mich reissen!
=> irc://irc.quakenet.eu.org:6667/delphi.de da werden Sie auch (manchmal) geholfen
  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 07:45 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