usuwanie danych z pliku

0

Witam. Malutki problemik:

Mam prostą bazę danych na typach, kolejne dane są dopisywane do pliku, przykład:

type cos = record
     zmienna1 : integer;
     .....
    end; 

var
 costam : file of cos;
 zm_costam : cos;

begin
....
 zm_costam.zmienna1 := 1;
 write(costam, zm_costam);
end;

I teraz moje pytanie. Jak mogę napisać funkcje kasującą daną pozycję z pliku i przesunięcia danych leżących dalej w miejsce usuwanej pozycji, tak aby nie powstawały "dziury". W sumie <ort>najprostrzą </ort>metodą byłoby wstawianie ostatniej pozycji w miejsce kasowanego rekordu, ale to nie estetyczne i w sumie nie o to chodzi.... Z góry THX

Pozdro.

// Używaj tagu Delphi

0

Możesz dodać do rekordu COS jedno pole logiczne wskazujące, czy dany rekord nie został usunięty. Wówczas przy usuwaniu, taki rekord nie byłby w rzeczywistości usuwany, a tylko to pole ustawiane byłoby na TRUE. Przy wyszukiwaniu, wyświetlaniu itd. danych z takiego pliku, rekordy z tym nowym polem ustawionym na TRUE nie byłyby brane pod uwagę. Dodatkowo w swoim programie musiałbyś dodać możliwość rzeczywistego usuwania rekordów oznaczonych jako usunięte.
Wydaję się to nieco pogmatwane, ale w rzeczywistości, tzn. w prawdziwych bazach danych, stosowany jest podobny mechanizm. Jeśli usuniesz kilka rekordów z tabeli (np. Paradox), to rekordy te są tylko oznaczane (przez BDE) jako usunięte, a rozmiar pliku z tabelą nie ulega zmianie. Robiąc zrzut szesnastkowy pliku z tabelą można w nim zobaczyć rekordy usunięte! Aby usunąć rekordy oznaczone jako usunięte trzeba spakować tabelę.
(zob.: http://4programmers.net/Forum/viewtopic.php?id=40674)

0

Znaczy zrobilem cos takiego:

while not eof(FArtykuly) do
    begin
      Seek (FArtykuly, kasuj_pozycje + 1);
      try
        read (FArtykuly, Artykuly);
        Seek (FArtykuly, kasuj_pozycje);
        write(FArtykuly, Artykuly);
        inc (kasuj_pozycje);
      except

i tu wlasnie jest problem, nie wiem jak ostatni rekord usunac, albo chociaz wskaznik ostatni... bo w takiej postaci ostatniego rekordu mi nie ort!, a predostatni jest identyczny jak ostatni oraz wielkosc bazy tez sie nie zmniejsza...

0

najprosciej Truncate(plik) na ostatniej pozycji. To polecenie ucina plik...

0

jeżeli chcesz mieć dane uporządkowane to i tak będziesz musiał je liniowo poprzesuwać. Co do samego usuwania to nie powinieneś mieć problemów (ja polecam interpolacyjne usuwanie)

1 użytkowników online, w tym zalogowanych: 0, gości: 1