Hilfe, mein Denkfehler verstrickt sich immer mehr :-)

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Delle
Beiträge: 1130
Registriert: 10.05.2005 22:48

Hilfe, mein Denkfehler verstrickt sich immer mehr :-)

Beitrag 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 :-)
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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)
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Delle
Beiträge: 1130
Registriert: 10.05.2005 22:48

Beitrag 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.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag 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) 
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Delle
Beiträge: 1130
Registriert: 10.05.2005 22:48

Beitrag 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 ;)
Benutzeravatar
Delle
Beiträge: 1130
Registriert: 10.05.2005 22:48

Beitrag 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 ;)
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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 /:->
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten