Writebyte - Problemchen

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

CO2

ehemals "SirMO"

Betreff: Writebyte - Problemchen

BeitragMi, Nov 03, 2010 16:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
Ich komme mal wieder mit einem Problem bei einem Befehl zu euch...
Folgende Lage:
Ich habe eine Funktion, die Daten Zusammenfasst.

(BlitzBasic: [AUSKLAPPEN]
Function SummerizeData(file1$, file1endung$, file2$, StartPoint$)

Local summerizedfile = OpenFile(file2$) ;File öffnen, in den Zusammengefasst wird

Local bytesspringen = 0 ;später

If summerizedfile = 0 Then ;kontrollieren, ob die Datei auch vorhanden ist

summerizedfile = WriteFile(file2$) ;Wenn nicht, erstellen

Else

Repeat ;Wenn ja, schauen, wieviele Bytes übersprungen werden müssen

ReadByte(summerizedfile)
bytesspringen = bytesspringen + 1

Until Eof(summerizedfile)

SeekFile(summerizedfile, bytesspringen)

EndIf

Local lesefile = ReadFile(file1$) ;Die Datei öffnen, die Zusammengefasst wird

Local sizeoffile = FileSize(file1$)

WriteLine summerizedfile, StartPoint ;Startpoint eintragen
WriteLine summerizedfile, file1endung ;Endung eintragen
WriteInt summerizedfile, sizeoffile ;groesse eintragen

For x = 0 To sizeoffile ;Solange Bytes reinschreiben,

WriteByte summerizedfile, ReadByte(lesefile)

Next ;Bis der File sein Ende erreicht hat

WriteLine summerizedfile, "Endof" + StartPoint ;Endpunkt reinschreiben

CloseFile summerizedfile ;Beide files schließen
CloseFile lesefile

End Function
)

Und eine die zusammengefasste Daten wieder liest
(BlitzBasic: [AUSKLAPPEN]
Function ReadSummerizedData$(file$, Startpoint$)

CreateDir "$$##USD##$$"

Local lesefile = ReadFile(file$)

Local suchestartmarke$
Local bytesspringen

Repeat

suchestartmarke = ReadLine(lesefile)

Until suchestartmarke = Startpoint Or Eof(lesefile)

Local endung$ = ReadLine(lesefile)

Local size = ReadInt(lesefile)

Local schreibefile = WriteFile("$$##USD##$$\" + Startpoint + "_" + file + "" + endung)

Local sucheendmarke$

Local springbyte = 0

For x = 0 To size

WriteByte schreibefile, ReadByte(lesefile)

springbyte = springbyte + 1

SeekFile(schreibefile, springbyte)
SeekFile(lesefile, springbyte)

sucheendmarke = ReadLine(lesefile)

Next

CloseFile schreibefile
CloseFile lesefile

Local file2$ = "$$##USD##$$\" + Startpoint + "_" + file + "" + endung

Return file2$

End Function
)

So, Wenn ich jetzt aber eine 3D-Datei (auch bei anderen Datein, z.b.: Textdateien) zusammenfasse und danach wieder unzusammenfasse, kommt ein Total anderer Code dabei raus

Da Bytes allerdings Buchstaben und Zeichen sind, kann der Fehler eigentlich nur bei Writebyte() oder Readbyte() liegen,

wie immer bedanke ich mich für hilfe im vorraus,
mfG,
SirMO
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti

Thunder

BeitragMi, Nov 03, 2010 16:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie ich dir schon einmal sagte, spekuliere ich nun wieder darauf, dass du Probleme mit Zeilenumbrüchen bekommen hast.
Außerdem besteht bei deinem Code enormes Optimierungspotenzial und da ich ihn im Moment nicht begreife, kann ich dir nur Mal dazu raten ein paar Optimierungen vorzunehmen und den Code durchzugehen, du musst schließlich am besten wissen, was er tut.

mfg Thunder
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit
 

CO2

ehemals "SirMO"

BeitragFr, Nov 05, 2010 15:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok, ich werde versuchen ihn zu Optimieren (auch wenn ich dachte, dass er so funktioniert...)

thx für die antwort, mir bleibt aber noch eine Frage:

Setzen Befehle wie Writebyte und Readbyte den Zeiger ein Byte nach vorn, nachdem die Funktion ausgeführt wurde?
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti

Pummelie

BeitragFr, Nov 05, 2010 15:50
Antworten mit Zitat
Benutzer-Profile anzeigen
wenn du den dateizeiger meinst.. klar...
It's done when it's done.
 

CO2

ehemals "SirMO"

BeitragFr, Nov 05, 2010 15:59
Antworten mit Zitat
Benutzer-Profile anzeigen
wirklich? Weil die Dateien immer kleiner waren als das original (also wenn ich nur WriteByte oder ReadByte benutzt habe, deshalb steht oben auch "Seekfile" in der hauptschleife...)
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti

Thunder

BeitragFr, Nov 05, 2010 16:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Ist doch logisch. Du hast in der Hauptschleife der Auseinandernehm-Funktion ein Readline. Da wird eine Zeile ausgelesen, die du nirgends an die ausgegebene Datei anhängst.
Außerdem ist das SeekFile vollkommen unnötig in der Schleife, weil eben alle Read und Write-Befehle den Dateizeiger um X Stellen (je nachdem welcher Datentyp) verschieben.

mfg Thunder
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit
 

CO2

ehemals "SirMO"

BeitragFr, Nov 05, 2010 16:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Readline() Sucht ja nur die Endmarke, da ich mir aber überlegt habe, erst die größe des Files zu ermitteln und diese dann einzutragen fällt das natürlich weg...,

Apropos ich merke gerade, dass der Code veraltet ist, hier die neuen Funktionen:

SCHREIBEFUNKTION
BlitzBasic: [AUSKLAPPEN]
Function SummerizeData(file1$, file1endung$, file2$, StartPoint$)

Local summerizedfile = OpenFile(file2$) ;File öffnen, in den Zusammengefasst wird

Local bytesspringen = 0 ;später

If summerizedfile = 0 Then ;kontrollieren, ob die Datei auch vorhanden ist

summerizedfile = WriteFile(file2$) ;Wenn nicht, erstellen

Else

Repeat ;Wenn ja, schauen, wieviele Bytes übersprungen werden müssen

ReadByte(summerizedfile)
bytesspringen = bytesspringen + 1

Until Eof(summerizedfile)

SeekFile(summerizedfile, bytesspringen)

EndIf

Local lesefile = ReadFile(file1$) ;Die Datei öffnen, die Zusammengefasst wird

Local anzzeilen = 0

Repeat

ReadLine(lesefile)
anzzeilen = anzzeilen + 1

Until Eof(lesefile)

SeekFile(lesefile, 0)

WriteLine summerizedfile, StartPoint ;Startpoint eintragen
WriteLine summerizedfile, file1endung ;Endung eintragen
WriteLine summerizedfile, anzzeilen ;Groesse eintragen

Repeat

WriteLine summerizedfile, ReadLine(lesefile)

Until Eof(lesefile)

CloseFile summerizedfile ;Beide files schließen
CloseFile lesefile

End Function


Writeline und Readline wurden in der Schleife benutzt, da Writebyte und Readbyte die Zeilen nicht richtig schreiben oder auslesen (Die Dateien sind nach ein - und wiederauspacken vom Programm mit dem sie erstellt wurden nicht mehr lesbar)

LESEFUNKTION
BlitzBasic: [AUSKLAPPEN]
Function ReadSummerizedData$(file$, Startpoint$)

CreateDir "$$##USD##$$" 'Ordner erstellen, in den die entpackte datei reingeschrieben wird

Local lesefile = ReadFile(file$) ;zusammengefassten file lesen

Local suchestartmarke$

Repeat ;datei durchsuchen, bis die startmarke gefunden wurde

suchestartmarke = ReadLine(lesefile)

Until suchestartmarke = Startpoint Or Eof(lesefile)

Local endung$ = ReadLine(lesefile) ;endung auslesen

Local size = ReadLine(lesefile) ;größe in (ACHTUNG) Linien auslesen

Local schreibefile = WriteFile("$$##USD##$$\" + Startpoint + "_" + file + "" + endung) ;file schreiben

For x = 0 To size ;file schreiben

WriteLine schreibefile, ReadLine(lesefile)

Next

CloseFile schreibefile ;Beide Files schließen
CloseFile lesefile

Local file2$ = "$$##USD##$$\" + Startpoint + "_" + file + "" + endung

Return file2$ ;Danach file returnen

End Function
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti
  • Zuletzt bearbeitet von CO2 am Fr, Nov 05, 2010 16:17, insgesamt einmal bearbeitet

Thunder

BeitragFr, Nov 05, 2010 16:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich rede von dem Code:
Code: [AUSKLAPPEN]
   For x = 0 To size
      
      WriteByte schreibefile, ReadByte(lesefile)
      
      springbyte = springbyte + 1
      
      SeekFile(schreibefile, springbyte)
      SeekFile(lesefile, springbyte)
      
      sucheendmarke = ReadLine(lesefile)
      
   Next


...
Edit: Ups, entschuldige bitte, der Code sah der anderen Funktion so ähnlich.
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit
  • Zuletzt bearbeitet von Thunder am Fr, Nov 05, 2010 16:29, insgesamt einmal bearbeitet
 

CO2

ehemals "SirMO"

BeitragFr, Nov 05, 2010 16:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Ist Ja überarbeitet (Post vor deinem)
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group