24. september 1999 - 08:39Der er
7 kommentarer og 2 løsninger
bare et lille spørgsmål mere vedr. Filhåndtering
hej! jeg har det meste af natten rodet rundt i møger og online doc. for at finde ud af hvordan man kan slette data fra en fil. der findes jo read og write metoderne, findes der ikke noget tilsvarende, eller skal jeg indlæse det jeg vil slette i mit objekt og der efter nustille det og skriveen NULL værdi på samme sted i filen?
Som diskuteret i tidligere spørgsmål, så flytter indholdet af resten af filen ikke bare. Men du kan slette på forskellige måder.
Når du snakker om read og write metoderne, så ved du jo tilsyneladende hvor meget plads en post fylder. Så kan du:
1) Gøre som du foreslår (men ingen grund til først at indlæse!) 2) Flytte resten af filindholdet sizeof(post) bytes tilbage, så det overskriver posten. 3) Du kan udskrive et tomt objekt på pladsen
Jeg vil anbefale mulighed 2. 1 og 3 vil jeg jo få din fil til at vokse og vokse efterhånden som objekter slettes og tilføjes (uden, at der nødvendigvis bliver mere indhold).
Jeg vil foreslå at den første på i din fil, er en kontrol post (som jo godt kan have en anden længde og/eller udseende end resten af posterne i filen) og at denne post indeholder post-nummeret på den sidste (ja - sidste) slettede post i filen. Den skal så i sin tur pege tilbage til den forrige slettede osv. Hver gang du så sletter en post, sætter du nummeret fra kontrol-posten ned i den slettede post, og retter derefter nummeret i kontrol-posten, til at pege på den post i stedet for.
Dette kalder man en free-list. Ideen er at når du så skal lægge nye data i din fil, checker du først om der er en ledig slettet plads. Hvis det er tilfældet, putter du din post ind der, og flytte kontrol-postens pointer til den post som nu er den sidst slettede. (Vha. post-nummeret fra den post du lige har genbrugt.) Hvis der ingen slettede poster er (nummeret i kontrol posten er nul), ja så smider du bare posten i enden af filen.
soepro >> smart (i hvert fald en af de hurtigste løsninger - afviklingsmæssigt), men hvis du en dag sletter 3/4 af en fil på XXMB, så bruger du en hel del unødig plads temmelig længe (hvis du overhovedet nogensinde får fyldt de tomme pladser op igen)! Så valget af løsning må vel i grunden også bygge lidt på viden om hvordan filens data vil blive brugt og ændret, ikke?
Det var jo også muligt at lave en blandet løsning - at køre med soepro's kædede lister indtil en vis grænseværdi, ex. 30% af pladsen i filen bruges på ingenting, hvor man så rydder op. Dette kan f.eks. gøres ved at lave en ny fil, og så kopiere alle data over i den, og oprette et index i den som svarer til de ny data. De slettede bliver så tilbage. Smart, ik'?
Tak for de gode ideer, det burde være nok til at komme videre. Det er fedt når der komer lidt gang i debat og oplæg til emnerne så for sådan nogle c++ kid som mig en masse input vi kan tænke lidt over. Simon
bjarke >> Du har kun ret sålænge at forskellen på en (næsten) tom fil og den fulde fil er mange MB.
Et andet & pladsmæssigt bedre alternativ til at lave et slette liste, er at tage den SIDSTE post i filen, og så kyle den ind på den tomme plads, for herefter at forkorte/truncate filen vha. 'chsize()' functionen. På den måde er din fil aldrig større end nødvendigt. Men det kræver almindeligvis at man så også opdaterer sin indeks-fil for den flyttede post også - og ved store indekser koster det megen tid.
Men du har selvfølgelig ret - det er altid et tradeoff mellem plads og hastighed. (Reorganiseringen tager tid - genbrug af slettede poster fylder lidt mere.) Ved små filer og store filer uden ret megen udskiftning (mange sletninger i eet hug, oprettelser i mange hug) vil der ikke være så meget at hente på at reorganisere - ellers kan der selvfølgelig være rigtigt meget.
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.