Jak z pliku typowanego usunąć rekord ??
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...
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
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
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
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
jeżeli chcecie mi pomóc (bo nic nie kumam) to piszcie na jjczopek@wp.pl i ja wam przyśle xcały ten mój program i wtedy mi powiecie jak mam zrobić usuwanie.
jeżeli chcecie mi pomóc (bo nic nie kumam) to piszcie na jjczopek@wp.pl 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
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.]=-
{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
{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
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.
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
{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.]=-