Dateiinhalt abschnittsweise ausgeben
Übersicht

danibertBetreff: Dateiinhalt abschnittsweise ausgeben |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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") Wie kann ich das hinbekommen? Vielen Dank im Voraus für alle Tipps |
||
![]() |
kog |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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) |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group