du kan erklære dig er array of byte som du så kalder en SetLenght() på når du ved hvor meget mem du skal bruge ... Så er det bare at søge / ændere i din buffer.
Brug BLOCKREAD i stedet for. Så kan du indlæse en stor blok data ad gangen. Behandle denne blok og så læse en stor blok igen. Det vil speede hastighede meget op. Nu står du od læser en byte fra disken ad gangen.
Prøv at kigge lidt på Stream\'s, f.eks. TMemoryStream, den er ok
MemStream.LoadFromFile(); MemStream.Memory^ , giver dig en pointer til din hukommelse, du kan også evt. sætte denne pointer til en PChar og så bare tælle denne op :
Microtec >> BlockRead er heller ikke det nemeste med at tilpasse block\'en til fil størelse osv. der er en masse du kan holde øje med, og en memorystream castet til en pchar er nu temmelig nem at håndtere. Hvis man ikke vil bruge en stream, så er et array da nok det smarteste, som boris nævner.
BlockRead kan desværre ikke bruges, da jeg har lavet programmet sådan at den seek´er i filen, og bruger den byte den har læst..
\"Har brugt RomFile : File of Byte;\"
Men det med at ligge helt lortet i en Array er måske ikke så dårlig ide, troede bare ikke man kunne lave så stor en Array..
Men problemet er jo bare, at jeg ikke ved på forhånd helt hvor stor filen er.. Så jeg kan vel ikke bare sige RomArray : Array[1..RomSize] of Byte; Kan jeg ??
PS. Sidder ikke lige ved en maskine med Delphi lige nu :( Troede ikke det gik så hurtigt herinde !!
Jeg vil lige undersøge det så hurtigt jeg kan, og så skrive om det virker/give point..
PS2. Jeg fatter ikke en klap om pointer, så hvis jeg skulle bruge det, skal jeg desværre nok have et rimelig godt eksempel på hvordan det skulle laves..
martinlind >> Jeg mente bare at når du benytter memorystream begynder du også at snakke pointer ;o)
boris løsning med et array er fin, da man så kan læse hele arrayet i et hug. Det forudsætter bare at filen har den samme størrelse hele tiden.
Mht. Blockread, så behøver du ikke tilpasse bloken til filstørrelsen. Du kan f.eks. læse 64KByte ad gangen. Hvis den sidste læsning ikke fylder 64K, læses der blot den resterende del. Parametren \"Count\" fortæller så hvor mange bytes der blev læst.
muttley >> Dit program vil blive langsom når du seek´er i filen. Det er det der tager tid. Du kan f.eks. læse 64K ind med Blockread. Lave checsum-beregninger på denne blok i memory, og så læse den næste blok.
begin F := TMemoryStream.Create; F.LoadFromFile(<FileName>); SetLength(RomArray,F.Size); Move(F.Memory^,RomArray,F.Size); SetLength(<RomArray-size>); F.Free; // Også ellers bare der udaf *S*
microtec >> open arrays findes i d5, og du skal lave housekeeping hvis du bruger blockread, funktionerne der laver checket skal jo kunne håndetere forskellig længde af din block, og hvad nu hvis du skal bruge en byte fra den sidste og en fra den næste osv.
Jeg er vildt imponeret over den respons der er kommet, og tror godt jeg kan komme videre med det i har skrevet indtil nu..
Men jeg skrev nu altså i mit spørgsmål at jeg havde lavet det i Delphi5..
Og til sidst, så kan blockRead altså desværre ikke bruges, da jeg ikke bare starter fra starten af filen, og læser til enden, jeg skal kunne bruge data fra rundt omkring i filen hele tiden..
muttley >> Du skal læse HELE finen ind i memory, og så hoppe rundt i memory og hente dine data. Det er langsomt hvis du hopper rindt og henter data forskellige steder i selve filen. BlockRead kan fint bruges til dette. De andre løsninger er også gode. Martin´s og Boris´s forslag kræver bare at du benytter Delphi5. Jeg var ikke klar over at Array´s var ændret i denne version. Erklæringen \"RomArry : array of byte;\" er ikke lovlig i de versioner af Delphi jeg sidder med.
Bare rolig, Martin og jeg har haft værre diskussioner end denne. Så længe der er *s* og *gg* er det ikke så slemt :o)
martinlind >> Jeg gad utroligt godt at kunne bruge din metode, og har jeg prøvet at lege lidt med det, men har desværre ikke fået ret meget ud at det, andet end at min computer skulle genstartes nogle gange.. :(
Jeg har forsøgt at gøre som du sagde, men har åbenbart ikke fået det hele på plads..
Hvad gør jeg lige galt ?? :
procedure TForm1.Button1Click(Sender: TObject);
Var RomArray : array of byte; F : TMemoryStream;
begin If OpenDialog1.Execute then Begin Edit1.Text:=\'Loading..\'; F := TMemoryStream.Create; F.LoadFromFile(OpenDialog1.FileName); SetLength(RomArray,F.Size); Move(F.Memory^,RomArray,F.Size); Edit1.Text:=\'File loaded\'; End; end;
PS. Computer går under eller kommer med en fejlmeddelse, efter jeg har valgt en fil i OpenDialog boxen.. :(
og husk så lige du skal flytte dit RomArray væk fra procedure Var\'en ellers er data væk når du kommer ud af proceduren, du skal flytte erklæeringen op på Formclassen eller til en Global.
muttley >> RomArray[1] peger på 1 element, men da delphi lægger alle elementer lige efter hinanden så kan man læse hele klumpen ind med move og første element som start.
/Martn
PS. husk lige for en ordens skyld at ændre det jeg skrev tidligere
martinlind >> Og jaja.. :) Jeg skal nok flytte RomArray væk fra Proceduren, det jeg viste herinde, var bare et lille testprogram jeg lavede så jeg kunne afprøve det..
Det ville jo ikke være så skide fedt hvis jeg legede med det i det rigtige program, da hvis da skulle ske noget, kunne jeg jo midste det hele.. :)
Lige til sidst, kan en så utrolig person som dig ikke lige hurtig fortælle hvordan jeg nemmeste får hele RomArray´en ned i en ny fil ??
Eller skal jeg oprette et nyt spørgsmål for at få svar på det ??
Du skal Lave en Ny MemeryStream og sætte dens størelse ( SizeOf(RomArray); ) og så skal du bruge Move ( Move(RomArray[0],F.Memory^,SizeOf(RomArray)); ) til at flytte data ind i den og SaveToFile(<FileName>); til at gemme i en ny fil
Dette burde virke, jeg har dog ikke testet det men mon ikke det virker det vil jeg tro.
/Martin
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.