Dateiinhalt abschnittsweise ausgeben

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

 

danibert

Betreff: Dateiinhalt abschnittsweise ausgeben

BeitragSo, Jul 11, 2010 19:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
ich versuche eine Datei einzulesen und den Inhalt in nummerierten Abschnitten mit je 64 Byte Länge auszugeben.
Das Ganze soll auch bei extrem großen Dateien funktionieren und nicht auf Textdateien beschränkt sein. Mit dem folgenden Versuch bekomme ich die Datei zwar eingelesen, die Ausgaben sind aber nicht lesbar (obwohl ich als Quelle eine Textdatei verwende)

BlitzMax: [AUSKLAPPEN]
Print dateilesen("J:/testtext.txt")



Function dateilesen:Int(path:String)

Local buffersize:Float = 64
Local bytesGesamt:Float = FileSize(path)
Local prozent:Float = 0
Local prozentTemp:Float = buffersize / (bytesGesamt / 100)
Local durchgang:Int = 0

Local fileStream:TStream = OpenStream(path$, True, False)


Local buffer:Byte Ptr = MemAlloc(bufferSize)


Repeat

Local bytesRead:Int = fileStream.Read(buffer, bufferSize)

Print "Datenpaket " + durchgang + ": " + String.FromBytes(fileStream, bufferSize)

durchgang = durchgang + 1

Until fileStream.Eof()

End Function

Wie kann ich das hinbekommen?
Vielen Dank im Voraus für alle Tipps

kog

BeitragSo, Jul 11, 2010 22:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Zwar nicht getestet, aber sollte nicht
Code: [AUSKLAPPEN]
Print "Datenpaket " + durchgang + ": " + String.FromBytes(buffer, bufferSize)


sein?

Du liest ja schon die Daten der Datei in den Buffer, aber verwendest ihn nicht?
 

danibert

BeitragMo, Jul 12, 2010 10:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für den Tipp.
Jetzt habe ich aber ein ganz anderes Problem damit:
Wenn ich größere Dateien einlese (Mehr als 1 MB), oder auch mehrere kleine Dateien hintereinander, scheint zunächst alles zu funktionieren. Alle Strings werden korrekt ausgegeben. Allerdings geht mein Programm nach Abschluss des Vorganges einfach aus. Keine Fehlermeldung oder sonst etwas, als hätte ich einen end Befehl gesetzt.

Im Debugmodus tritt das Problem nicht auf, ich kann also überhaupt nicht untersuchen, woran das liegt.
Wie kann ich das herausfinden, was hier falsch läuft?
 

undefined

BeitragMo, Jul 12, 2010 13:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe mal spontan 5 Tipps für Dich und Deinen Code:

1) "Repeat / Until eof" durch "While not eof / Wend" austauschen (verhindert Abstürze, wenn Du eine leere Datei öffnest)

2) "CloseStream" am Ende der Funktion (kann sein, dass TStream das in der Delete automatisch tut, aber sauberer wäre es schon - und falls nicht, bleibt der Stream bis zum Prozessende geöffnet)

3) "MemFree" am Ende der Funktion (meines Wissens wird MemAlloc Speicher nicht vom GC verwaltet / wieder freigegegeben)

4) Du hast die Variable "BytesRead", Du solltest diese Variable in "String.FromBytes" anstatt der "BufferSize" verwenden

5) Bei "Stream.ReadBytes" lädst Du immer die komplette "BufferSize". Ich bin mir nicht sicher, ob diese Funktion einen Sicherheitstest hat, ansonsten wären alle Dateien problematisch, deren Grösse kein exaktes Vielfaches von "BufferSize" ist (überprüfe ob StreamPos + BufferSize > StreamSize und lade wenn nur die übrigen Bytes)

Vielleicht hilft davon schon was.
 

n-Halbleiter

BeitragMo, Jul 12, 2010 13:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Zu 5.: ReadBytes nutzt die Methode "Read". Von dieser werden die gelesenen Bytes zurückgegeben. Auch wird eine "TStreamReadException" geworfen, falls die gewünschte Anzahl Bytes nicht gelesen werden konnte.
mfg, Calvin
Maschine: Intel Core2 Duo E6750, 4GB DDR2-Ram, ATI Radeon HD4850, Win 7 x64 und Ubuntu 12.04 64-Bit
Ploing!
Blog

"Die Seele einer jeden Ordnung ist ein großer Papierkorb." - Kurt Tucholsky (09.01.1890 - 21.12.1935)

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group