Binäre Datei einlesen + als Datei abspeichern = immer 0 Byte

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

Binäre Datei einlesen + als Datei abspeichern = immer 0 Byte

Beitrag von Delle »

Hallo,

weiß jemand warum hier immer eine 0-Byte-Datei erzeugt wird?

In den Speicher wird alles korrekt eingelesen, das Erstellen der Datei funktioniert auch, allerdings werden keine Daten reingeschrieben .-(

Code: Alles auswählen

If ReadFile(0,"1.exe") 

length=Lof()
*MemoryID=AllocateMemory(length)
bytes=ReadData(*MemoryID,length)
CloseFile(0)

EndIf
						        
If CreateFile(0,"2.exe")

WriteData(PeekS(*MemoryID),length)
CloseFile(0)  

EndIf
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

Code: Alles auswählen

If ReadFile(0,"1.exe")

length=Lof()
*MemoryID=AllocateMemory(length)
bytes=ReadData(*MemoryID,length)
CloseFile(0)

EndIf
                         
If CreateFile(0,"2.exe")

WriteData(*MemoryID,length)
CloseFile(0) 

EndIf
So vielleicht? Ohne PeekS, denn als Rückgabe bekommst du einen String und der endet mit einem 0-Byte.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
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 »

Wie Daniel bereits sagte, wollte nur hinzufügen, das jeder Allocierte Speicher zu prüfen ist !!!!
Ansonsten Invalid Memory Access

If *MemorID
; bla blub
endif

Nach Gebrauch freigeben halte ich für Sinnvoll, ist aber nicht unbedingt
erforderlich.
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
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

ts-soft hat geschrieben:Wie Daniel bereits sagte, wollte nur hinzufügen, das jeder Allocierte Speicher zu prüfen ist !!!!
Ansonsten Invalid Memory Access

If *MemorID
; bla blub
endif
Stimmt, aber wenn PeekS schon klappt, dann dürfte dort eigentlich nicht der Fehler liegen. Es gehört sich aber das zu prüfen.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag von Falko »

Sowas ähnliches hatte ich Jens schon mal gepostet :twisted:

PB4: Binary write & read

@TS
Auch ich habe auf Memory jetzt nicht geprüft, was aber jeder selbst ändern kann, wenn er es für nötig hält 8)

Grüße Falko
Bild
Win11 Pro 64-Bit, PB_6.11b1
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 »

Falko hat geschrieben: @TS
Auch ich habe auf Memory jetzt nicht geprüft, was aber jeder selbst ändern kann, wenn er es für nötig hält 8)

Grüße Falko

Code: Alles auswählen

If *Buffer
Und was ist das :mrgreen:

Hat es nen besonderen Grund, das die Routine alles Byteweise macht, weil so
wie es da genutzt wird, wäre ReadData und WriteData ein vielfaches
schneller mit demselben Ergebnis.
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
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag von Falko »

ts-soft hat geschrieben:
Falko hat geschrieben: @TS
Auch ich habe auf Memory jetzt nicht geprüft, was aber jeder selbst ändern kann, wenn er es für nötig hält 8)

Grüße Falko

Code: Alles auswählen

If *Buffer
Und was ist das :mrgreen:

Hat es nen besonderen Grund, das die Routine alles Byteweise macht, weil so
wie es da genutzt wird, wäre ReadData und WriteData ein vielfaches
schneller mit demselben Ergebnis.
Ich wusste, das du darauf antworten würdest.
>>If *Buffer ; habs auch nach langer Zeit nicht wieder angesehen :mrgreen:


Sicher ist das Andere schneller. Vielleicht will man ja auch einzelne Bytes (Buchstaben, Zahlen) ändern. Dann ist es auch im Speicher praktisch.
Ist ja auch nur ein weiterer Tip. An einem Wettbewerb will ich mich absolut nicht beteiligen :twisted:

Grüße Falko
Bild
Win11 Pro 64-Bit, PB_6.11b1
Antworten