Syntacks_Error hat geschrieben:Verblüffend, vielen Dank. Das ist gefühlte 1000* schneller als als meine Geschichte. Wieso eigentlich?
Habe noch vier

Fragen dazu:
Wie kriege ich den Speicher wieder frei? freemem(*memory) wirft bei allen möglichen Variationen (incl *memory.character) einen Fehler aus.
Was bedeutet eigentlich dieses \c?
Müßte es nicht vielleicht "test$ = Space(file_size *SizeOf(character))" statt "test$ = Space(file_size/SizeOf(character))" heißen, wenn unicode berücksichtigt werden soll?
Offenbar kann man beim rechnen den neuen wert weglassen, also "x+1" statt "x = x+1"?
*memory ist nach der Routine verändert, also müsste man es so machen:
Code: Alles auswählen
file_size = FileSize(dateiname$)
file_ID = ReadFile(#PB_Any, dateiname$)
*memory.Character = AllocateMemory(file_size)
*oldMemory = *memory
datei_lesen = ReadData(file_ID, *memory, file_size)
If datei_lesen
test$ = Space(file_size / SizeOf(Character))
*testPointer.Character = @test$
*memoryEnd = *memory + file_size
While *memory < *memoryEnd
If *memory\c > 0
*testPointer\c = *memory\c
*testPointer + SizeOf(Character)
EndIf
*memory + SizeOf(Character)
Wend
test$ = Left(test$, *testPointer - @test$)
EndIf
Debug "Teststring: " + Left(test$,100)
FreeMemory(*oldMemory)
Die Pointer sind ja hier Strukturiert. Wenn du Alt+S drückst siehst du die vordefinierten Strukturen. Darunter Character mit c.c

. Man greift also auf den Inhalt an der Adresse zu als ob es ein Character wäre.
file_size ist die komplette Dateigröße, mehr Raum wird nicht benötigt, also ist "*" falsch. Da wir ja in der Datei aber maximal file_size / SizeOf(Character) Daten vom Typ Character in Reihe haben stimmt das "/".
Ja beim Rechnen kann man das = weglassen so wie du es sagtest.