Jak usunąć "wpis"(strukture) z pliku

0

Witam !
.......C++ Builder..........
Mam plik do którego zapisuje i z którego czytam zmienne typu strukturalnego !!

plik.open("Dane.txt", ios::out|ios::app|ios::binary);
plik.write((char *)&nowa, sizeof(osoba));

Jak usunąć dodany wpis z pliku (nie kasując tego pliku) ????

Może istnieje w bibliotece fstream.h jakiś odpowiednik funkcji z pascacla trunc - która "ucina" plik w odpowiednim miejscu bo funkcja int chsize(int handle, long size); odpada bo musze jeszcze raz plik otwierać a tego nie chcę ;/
...a może wystarczy zapisać "jakiś" znak, który usuwa !! coś w sytylu znaku o numerze 8(ASCII) backspace ....nie wiem ;/ Pomocy................ ;?

0

Najprostsze rozwiązanie:

  1. utworzyć (i zapisać) nową wersję pliku bez danego rekordu i o innej nazwie/rozszerzeniu
  2. usunąć stary plik
  3. zmienić nazwę nowego pliku na tą właściwą

Drugie rozwiązanie to zastosowanie znacznika(flagi) z każdym rekordzie, który określałby czy rekord jest widoczny czy nie. Minus tego rozwiązania jest taki, że plik będzie się rozrastał w miarę jego używania (co prawdopodobnie zmusi cię do użycia Najprostszego rozwiązania ;) ).

[...] (nie kasując tego pliku) ????

A to dlaczego?

[...] odpada bo musze jeszcze raz plik otwierać a tego nie chcę ;/

No i co z tego, że jeszcze raz go otworzysz?

0

Dzięki za wskazówki :) !

Pierwsze rozwiązanie odpada ! np.: mam w pliku MILION wpisów i chcę usunąć jeden to muszę teraz tworzyć nowy plik i przepisywać wszystkie rekordy bez jednego !! ile ja bym czekał za nim by się to przepisało wszystko ...a to tylko głupie usunięcie jednego wpisu ;)

Drugie rozwiąznie nie jest zbyt eleganckie ;/ (nie bedę wymieniła jego niedoskonałości ;)

A trzecie rozwiązanie mine irytuje bo muszę ten sam plik otwierać jeszcze raz (choć jest już otwarty) i musze tworzyć nowy wskaźnik do tego pliku (choć mam referencję do strumienia tego pliku !!)

Interesuje mnie rozwiąznie które wykorzystuje już zdefinowaną referencję do zmiennej plikowej i otwarty już plik ! ;)

0
  1. Zastanów się co chcesz zrobić? Usunąć "strukturę", czy uciąć plik?
  2. Przeczytaj jeszcze raz post 0x666, chyba nie zrozumiałeś? To nie są 3 metody, to jest jedna w trzech krokach... :P A drugą jest zapis znaczników w pliku (dirty-flag? ;) )
  3. Czy musisz używać strumieni skoro chcesz takie operacje wykonywać na pliku z danymi??
0

dokładnie wiem co chciłą mi przekazać 0x666 ;)

Jak napisałem na samym początku ;) chcę usunąć dodany wpis z pliku (wpis jest typu strukturalnego) !
(...a mogę go też sunąć ucinając plik !! oczywiście po odpowiednich wcześniejczych modyfikacjach ; )
Po prostu nie chcę trzymać w pliku niepotrzebnych wpisów !!

0
Kubuś(autor_postu;) napisał(a)

Jak napisałem na samym początku ;) chcę usunąć dodany wpis z pliku (wpis jest typu strukturalnego) !
(...a mogę go też sunąć ucinając plik !! oczywiście po odpowiednich wcześniejczych modyfikacjach ; )
Po prostu nie chcę trzymać w pliku niepotrzebnych wpisów !!

Więc żadne ucinania nie są ci potrzebne, a co masz zrobić już napisał 0x666.

0

ok :)
przykładowo mam plik z damymi który zajmuje ok 200 MB jest w nim ok 2000 wpisów ! i jak chcę skasowac wpis o numerze 1999 to musze tworzyć NOWY plik przepisywac do niego to samo co już mam w pierwszym pliku bez wpisu 1999 !! jest to strata czasu ....i może nie mam aktualnie 400MB wolnego na dysku !!
Czy jest INNY sposób na skasowanie wpisu z pliku ?? ....... ??

marcinEc wcześniej napisał :

  1. Czy musisz używać strumieni skoro chcesz takie operacje wykonywać na pliku z danymi??

O co mianowicie chodzi ..?

0
Kubuś(autor_postu; ) napisał(a)

ok :)
przykładowo mam plik z damymi który zajmuje ok 200 MB jest w nim ok 2000 wpisów ! i jak chcę skasowac wpis o numerze 1999 to musze tworzyć NOWY plik przepisywac do niego to samo co już mam w pierwszym pliku bez wpisu 1999 !! jest to strata czasu ....i może nie mam aktualnie 400MB wolnego na dysku !!
Czy jest INNY sposób na skasowanie wpisu z pliku ?? ....... ??

W ogólnym przypadku nie ma innego sposobu.
Natomiast to czego nie bierzesz pod uwagę to odpowiednie zaprojektowanie takiego systemu z 200MB plikami danych... Jeżeli już są tak duże struktury, to wymagają one specjalnego traktowania, np. prealokacjia miejsca na dysku, indeksowanie, czy właśnie oznaczanie skasowanych danych.

Jak chcesz tak teoretycznie podyskutować to proszę bardzo. Ale co TY chcesz zrobić? Program na zaliczenie z 10 wpisami i płaczesz, że nie będziesz otwierał i przepisywał? :>

Kubuś(autor_postu; ) napisał(a)

ok :)
marcinEc wcześniej napisał :

  1. Czy musisz używać strumieni skoro chcesz takie operacje wykonywać na pliku z danymi??

O co mianowicie chodzi ..?

O truncate... Nieważne.

0

Jak chcesz tak teoretycznie podyskutować to proszę bardzo. Ale co TY chcesz zrobić? Program na zaliczanie z 10 wpisami i płaczesz, że nie będziesz otwierał i przepisywał?

Nie chcę teoretycznie dyskutowac !!... a moja sesja się już zakończyła ;) ..i nie musze robić programów na zaliczenie ;)
Mam problem: W jaki najbardzej optymalny(czas i miejsce na dysku) sposób usunąć wpis z pliku....?

0

Kubuś, a jak myślisz jak są zrobione bazy danych np. Accessa? Każdy rekord ma pole oznaczające czy rekord jest usunięty czy nie. Dlatego w miarę wpisywania nowych danych, nawet jeśli je kasujesz, to plik zwiększa swój rozmiar. I tu pojawia się wspaniała opcja defragmentacji, która przepisuje na nowo plik bez rekordów oznaczonych jako usuniętych. Wg mnie ta metoda jest dobra, bo:

  1. Podczas kasowania pojedynczego wpisu dysk nie jest prawie w ogóle używany (jakby się stało przy przepisywaniu pliku)
  2. Po skasowaniu wpisu możesz dalej pracować (nie trzeba czekać na przepisanie pliku)
  3. Opcje defragmentacji użytkownik wybiera kiedy chce (np. ma czas i chce zmniejszyć objętość pliku bazy)
0

ok :) Dzięki Wszystkim :)

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