Avatar billede shjtip Nybegynder
24. september 1999 - 08:39 Der 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?
Avatar billede shjtip Nybegynder
24. september 1999 - 08:40 #1
"bøger" "skrive en" god morgen :-)
Avatar billede bjarke Nybegynder
24. september 1999 - 08:57 #2
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).

Håber jeg har forstået dig rigtigt.
Avatar billede soepro Nybegynder
24. september 1999 - 13:15 #3
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.
Avatar billede bjarke Nybegynder
24. september 1999 - 13:20 #4
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?
Avatar billede bjarke Nybegynder
24. september 1999 - 14:02 #5
fortsat...

altså mange små ændringer, så bør din løsning vælges. (Få) store ændringer, så bør min løsning vælges - eller hva'?
Avatar billede lrj Nybegynder
24. september 1999 - 14:28 #6
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'?

Således kunne man undgå hovedløs programmering :)
Avatar billede shjtip Nybegynder
24. september 1999 - 14:52 #7
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
Avatar billede bjarke Nybegynder
24. september 1999 - 14:57 #8
Herligt (det gør vi andre også);-)
Avatar billede soepro Nybegynder
24. september 1999 - 16:05 #9
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.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester