Seite 1 von 1

Hilfe, mein Denkfehler verstrickt sich immer mehr :-)

Verfasst: 14.12.2005 23:23
von Delle
So, kurz und knapp erklärt: Eine Datei wird eingelesen und häppchenweise wieder in eine andere geschrieben (mag sinnig erscheinen, aber ist ja nur ein Ausschnitt).

Auftretendes Problem: Datenverlust, sprich die neue Datei "orte.txt" ist nicht identisch mit der originalen Datei die man öffnet.

Einfach mal irgendeine Textdatei mit viel Text nehmen und dann mit der erstellten "orte.txt" vergleichen (am Ende der Datei sieht man das was fehlt).

Code: Alles auswählen

load$=OpenFileRequester("","","Text|*.txt",0)
						
ReadFile(0,load$) 
length=Lof()
*MemoryID=AllocateMemory(length)
If *MemoryID:bytes=ReadData(*MemoryID,length):EndIf
CloseFile(0)
						
OpenFile(1,"orte.txt")
						
haeppchen=1024
pakete=bytes/haeppchen
uebrig=bytes-(pakete*haeppchen)
									
If pakete>0 ; wenn Datei größer als 1024 Bytes
						  		
								  		
	For i=1 To pakete
											
											
		WriteData(*MemoryID+(i*haeppchen)-haeppchen,haeppchen)
																						
	Next
						

; falls noch ein Rest ist...			
If uebrig>0
WriteData(*MemoryID+(bytes-uebrig)-haeppchen,uebrig)
EndIf
									
Else

; Datei ist kleiner als 1024 Bytes...			
WriteData(*MemoryID,uebrig)
											
EndIf
									
CloseFile(1)
Zum Code: Ist eine Schleife die Pakete á 1024 Bytes schreibt, was übrig bleibt wird am Schluss noch angehangen, sollte die geöffnete Datei unter 1024 Bytes groß sein, wird die Schleife nicht abgearbeitet und nur die paar Bytes reingeschrieben.

Wo liegt mein Fehler? Kann nur was Einfaches sein, aber je mehr ich daran rumändere, desto gravierender werden die Fehler :-)

Verfasst: 14.12.2005 23:36
von ts-soft
Vielleicht so:

Code: Alles auswählen

load$=OpenFileRequester("","","Text|*.txt",0)
                  
ReadFile(0,load$)
length=Lof()
*MemoryID=AllocateMemory(length)
If *MemoryID:ReadData(*MemoryID,length):EndIf
CloseFile(0)
                  
OpenFile(1,"orte.txt")
                  
haeppchen=1024
uebrig=length%haeppchen
pakete=length/haeppchen
                           
If pakete>0 ; wenn Datei größer als 1024 Bytes
                          
                                
   For i=1 To pakete
                                 
                                 
      WriteData(*MemoryID+(i*haeppchen)-haeppchen,haeppchen)
                                                                  
   Next
                  

; falls noch ein Rest ist...         
If uebrig>0
WriteData(*MemoryID+(length-uebrig)-haeppchen,uebrig)
EndIf
                           
Else

; Datei ist kleiner als 1024 Bytes...         
WriteData(*MemoryID,uebrig)
                                 
EndIf
                           
CloseFile(1)

Verfasst: 14.12.2005 23:56
von Delle
Hm, da kommt das Gleiche raus :-/

Im oberen Teil muss nichts geändert werden, das funktioniert soweit... also "bytes" stimmt von der Länge her.

Verfasst: 15.12.2005 00:07
von ts-soft
Delle hat geschrieben:Hm, da kommt das Gleiche raus :-/
bei mir fehlt da nichts
Delle hat geschrieben: Im oberen Teil muss nichts geändert werden, das funktioniert soweit... also "bytes" stimmt von der Länge her.
Ist aber überflüssig, Du ermittelst die Länge doch schon vorher.

Verfasst: 15.12.2005 00:17
von edel
ts-soft hat geschrieben:
Delle hat geschrieben:Hm, da kommt das Gleiche raus :-/
bei mir fehlt da nichts
Delle hat geschrieben: Im oberen Teil muss nichts geändert werden, das funktioniert soweit... also "bytes" stimmt von der Länge her.
Ist aber überflüssig, Du ermittelst die Länge doch schon vorher.
Die Dateien sind zwar gleich gross aber der Inhalt stimmt nicht .

@delle
Versuch mal

Code: Alles auswählen

WriteData(*MemoryID+(length-uebrig),uebrig) 

Verfasst: 15.12.2005 00:26
von ts-soft
>> Die Dateien sind zwar gleich gross aber der Inhalt stimmt nicht .
Gelesen hab ich das Ergebnis nicht :lol: Hab nur das offensichtliche geändert, ohne drauf zu achten, obs auch der Fehler ist :mrgreen:

Verfasst: 15.12.2005 00:30
von Delle
hallodri hat geschrieben:@delleVersuch mal

Code: Alles auswählen

WriteData(*MemoryID+(length-uebrig),uebrig)
Thanks! Daran lag's... einfach nicht zu Ende gedacht ;)

Verfasst: 15.12.2005 00:37
von Delle

Code: Alles auswählen

length=Lof() 
*MemoryID=AllocateMemory(length) 
If *MemoryID:bytes=ReadData(*MemoryID,length):EndIf 
Das bytes=... ist eigentlich unnötig ich weiß,
aber irgendwo in der Doc/Tutorial stand das
man ruhig überprüfen sollte, wieviel tatsächlich
eingelesen wurde oder so ;)

Verfasst: 15.12.2005 00:55
von ts-soft
Delle hat geschrieben: Das bytes=... ist eigentlich unnötig ich weiß,
aber irgendwo in der Doc/Tutorial stand das
man ruhig überprüfen sollte, wieviel tatsächlich
eingelesen wurde oder so ;)
Ich wußte noch nichtmal, was ReadData zurückgibt, dachte nur irgendein #True. Habs also nur deshalb geändert. Den Modulo, den ich eingefügt habe, fand ich logischer und kürzer. Hab deshalb garnicht versucht Deine Rechnung zu überprüfen, sondern bin davon ausgegangen, das dort der Fehler steckt /:->