Wątek zablokowany 2017-12-28 12:55 przez furious programming.

[Delphi] Usuwanie [rekordów z pliku typowanego]

0

Jak z pliku typowanego usunąć rekord ??

0

Przepisać cały plik bez tego rekordu, albo przyjąć sobie w programie jakies oznaczenie na skasowany rekord (np. pierwszy bajt rekordu = 0) i zamazać tym bajtem rekord.

--
My programs never have bugs, they just develop random features...

0

Jeżeli jest na końcu pliku to ustawić wskaźnik na tym rekordzie (Seek(F, FileSize(F)-1)) i przyciąć plik (Truncate(F))
Jeżeli natomiast rekord jest w środku pliku to musisz przesunąć wszystkie rekordy będące za nim o jedno miejsce wstecz.

--
Jest jeszcze jeden błąd ... :)
--------Oficjalny kanał----------
Service for programmers w IRC:
Kanał: #4programmers
Serwer: warszawa.ircnet.pl
Sieć: POLNet
Port: 6667

0

Jeżeli natomiast rekord jest w środku pliku to musisz przesunąć wszystkie rekordy będące za nim o jedno miejsce wstecz.

Do czego, oczywiscie, swietnie nadaja sie BlockRead i BlockWrite [hurra]

--
Pawel {Delphi 6 Personal}

Po pierwsze: naciśnij F1

0

Do czego, oczywiscie, swietnie nadaja sie BlockRead i BlockWrite [hurra]

Akurat do plików typowanych BlockRead i BlockWrite nie są najlepsze. Lepiej już chyba otworzyć plik jako amorficzny i wtedy użyć BlockRead/Write (na pewno jest to najszybszy sposób ;-) )

--
Jest jeszcze jeden błąd ... :)
--------Oficjalny kanał----------
Service for programmers w IRC:
Kanał: #4programmers
Serwer: warszawa.ircnet.pl
Sieć: POLNet
Port: 6667

0

Akurat do plików typowanych BlockRead i BlockWrite nie są najlepsze. Lepiej już chyba otworzyć plik jako amorficzny i wtedy użyć BlockRead/Write (na pewno jest to najszybszy sposób ;-) )

Nie do konca zgodze sie z przedmowca. Zalozmy, ze plik jest tyu TMojRecord.

var
F: File of TMojRecord;
B : array of TMojRecord;
begin
AssignFile(F,'c:\winntprofilespqdesktopplik.txt');
Reset(F);
SetLength(B, Pred(FileSize(F))-Numer); //ustawienie dlugosci bufora
Seek(F,Succ(Numer)); //przesuwamy za usuwany
BlockRead(F, B[0], FileSize(F)-Succ(Numer)); //czytamy rekordy za usuwanym
Seek(F,Numer); //przesuwamy na usuwany
BlockWrite (F, B[0], Length(B)); //zapisujemy cosmy odczytali
Truncate(F); //obcinamy ogon
CloseFile(F);
end;

Kod nie jest zabezpieczony przed glupimi numerami rekordow. Jesli plik (a raczej jego czesc za usuwanym) jest bardzo duza, wtedy trzeba to rozpisac na raty. Kod latwo przerobic na usuniecie >1 kolejnych rekordow.

--
Pawel {Delphi 6 Personal}

Po pierwsze: naciśnij F1

0

jeżeli chcecie mi pomóc (bo nic nie kumam) to piszcie na [email protected] i ja wam przyśle xcały ten mój program i wtedy mi powiecie jak mam zrobić usuwanie.

0

jeżeli chcecie mi pomóc (bo nic nie kumam) to piszcie na [email protected] i ja wam przyśle xcały ten mój program i wtedy mi powiecie jak mam zrobić usuwanie.

Przecież pq napisał bardzo dobry program usuwający rekord o numerze Numer. Cóż więcej ci potrzeba?

--
Jest jeszcze jeden błąd ... :)
--------Oficjalny kanał----------
Service for programmers w IRC:
Kanał: #4programmers
Serwer: warszawa.ircnet.pl
Sieć: POLNet
Port: 6667

0

Ja zrobilem to kiedys tak (tylko to byl pascal):

procedure AddData(dane:DataType);
{dołącza na końcu pliku dane podane jako parametr}
begin
seek(plik,filesize(plik));
write(plik,dane);
end;

procedure RewriteData(nr:longint;dane:DataType);
{zamienia w pliku dane o podanym numerze na te...}
{...które są podane jako parametr}
begin
seek(plik,nr);
write(plik,dane);
end;

procedure DelData(nr:longint);
{kasuje w pliku dane o podanym numerze}
{w wolne miejsce wpisuje ostatni rekord i ucina plik}
var d:DataType; {d - zmienna pomocnicza}
begin
seek(plik,filesize(plik)-1);
read(plik,d);
RewriteData(nr,d);
seek(plik,filesize(plik)-1);
truncate(plik);
if nr = filesize(plik) then seek(plik,nr-1)
else seek(plik,nr);
end;

--
-=[.SlimY.]=-

0

{kasuje w pliku dane o podanym numerze}
{w wolne miejsce wpisuje ostatni rekord i ucina plik}

Sprytne, proste i efektywne. Brawo!

--
Pawel {Delphi 6 Personal}

Po pierwsze: naciśnij F1

0

{kasuje w pliku dane o podanym numerze}
{w wolne miejsce wpisuje ostatni rekord i ucina plik}

Sprytne, proste i efektywne. Brawo!

Fatalne. Zwykle istnieje potrzeba zachowania kolejności...

--
Jest jeszcze jeden błąd ... :)
--------Oficjalny kanał----------
Service for programmers w IRC:
Kanał: #4programmers
Serwer: warszawa.ircnet.pl
Sieć: POLNet
Port: 6667

0

a ja chce zrobić coś takiego:

mam podany numer rekord do usunięcia, np. 3.
procedura czyta kolejne rekordy i zapisuje jes, ale jak napotka 3 to dodaje jeden, czyli przeskakuje do następnego rekordu i przepisuje dalej.

0

Fatalne. Zwykle istnieje potrzeba zachowania kolejności...

Dryobates, dostrzeglem ten problem. Ale jesli takiej potrzeby nie ma, sposob jest bardzo dobry.

--
Pawel {Delphi 6 Personal}

Po pierwsze: naciśnij F1

0

{kasuje w pliku dane o podanym numerze}
{w wolne miejsce wpisuje ostatni rekord i ucina plik}

Sprytne, proste i efektywne. Brawo!

Fatalne. Zwykle istnieje potrzeba zachowania kolejności...

--
Jest jeszcze jeden błąd ... :)
--------Oficjalny kanał----------
Service for programmers w IRC:
Kanał: #4programmers
Serwer: warszawa.ircnet.pl
Sieć: POLNet
Port: 6667

Nie bylo mowy o zachowaniu kolejnosci :-P , w przeciwnym wypadku zgadzam sie ze trzeba wywalic i przesunac reszte. Moja baza z ktorej byl ten fragment kodu posiadala optymalizator ktory na zadanie uzytkownika wywalal puste rekordy i sortowal baze.

--
-=[.SlimY.]=-

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