usuwanie rekordów

0

Dlaczego ta procedurka nie usuwa mi rekordów z pliku? Wywala blad odczytu z dysku (return code #100) ?

0

Zapewne dlatego, że rewrite otwiera plik w trybie zapisu (gdy plik istnieje, zostaje on usunięty).
Btw, sizeof(dane) == 1? W innym wypadku Twój kod jest błędny.

0

procedure usun(p:tplik;pozycja:byte);
var i:byte;
begin
Assign(p,'tym.dat');
Rewrite(p);
[...]
close(p);

end;

I po co ci p jako parametr? No tak, bo przecież głuchy jesteś na to co mówimy.

seek(plik,pozycja);
for i:=1 to filesize(plik) do begin

Ten kod ma się crashować, tak? No to się udało.

Wywala blad odczytu z dysku (return code #100) ?

Ja się cieszę że mam debugger.

seek(plik,pozycja);
truncate(plik); // obciecie pliku do konca
seek(plik,FileSize(plik));

Skoro truncate przycina plik do aktualnego elementu to koniecznie potem przenieśmy się na koniec pliku (który przed chwilą ustaliliśmy).

for i:=1 to FileSize(p) do begin
seek(plik,i);
read(p,dane); //przepisanie danych z pliku tymczasowego
write(plik,dane);

end;

Formatowanie z d**y wzięte? Widać.
Nie mam pojęcia co ten kod robi bo nazywasz zmienne plikowe plik i p - ciekawe który to wejście ciekawe które to wyjście. O globalnej zmiennej plikowej plik nie mówiąc. Oczywiście jej deklaracja jest nieistotna, niech się domyślają. O typie tplik nie mówiąc - to mówi wszystko.

bo przepisuje rekordy po tym ktory chce usunac do tymczasowego potem obcinam plik i przepisuje dane do glw pliku

Weź mi wytłumacz po co je przepisujesz do tymczasowego pliku? Chcesz dysk zapchać? tablica/seekowanie za drogie???

0

Nie chce mi sie analizować całości ale jak masz seek na daną pozycję w pliku a później czytasz tyle rekordów ile jest w pliku to musi być źle. Przykładowo plik ma 100 rekordów ty jesteś na 10 a chcesz czytać znowu 100 to się wywali bo nie ma tylu rekordów musiało by być 110.

0

Wydaje mi się

Widzę że preferujesz zgadywanie nad debugowanie. Dziwne i jak widać daje marne skutki.

Ponieważ jak zakomentowałem przepisywanie danych do pliku tymczasowego to błąd nie wyskoczył

Jaka szkoda że twój debugger (zakładając że takowy posiadasz) nie pokazuje linii kreszującej. No ale przecież, taktyka zgadywanie, więc moim zdaniem nie powinieneś w ogóle się sugerować błędem, bo przecież to też jest w pewnym sensie debuggowanie.

Tylko nie wiem co jest źle ;(

Źle jest to że zamiast użyć narzędzi przeznaczonych do rozwiązywania takich problemów (np. debugger o którym ci się wspomina po raz setny) bawisz się w zgadywanie. Wyraźnie już napisałem który kod kreszuje:

-123oho napisał(a)

Ten kod ma się crashować, tak? No to się udało.

Ja już nie wiem jak do ciebie mówić, próbowałem niemiło, próbowałem miło (jak na mnie) a ty nadal jesteś takim samym geniuszem odwrotnie jak byłeś. Czy ty nas pytasz żebyśmy ci dali porady? NO TO DAJĘ PROSTA PORADĘ: UŻYJ DEBUGGERA!!! Teraz idź do googla i ucz się używać debuggera w tym środowisku którego używasz, albo przepadnij, bo naprawdę chyba nie tylko ja mam ciebie dość.

0

1. Formatowanie

procedure Usun(P: TPlik; Pozycja: Byte);
var
  I: Byte;
begin
  Assign(P, 'tym.dat');
  Rewrite(P);

  Seek(Plik, Pozycja);
  for I := 1 to FileSize(Plik) do
  begin
    Read(Plik, Dane);
    Write(P, Dane);
  end;

  Seek(Plik, Pozycja);
  Truncate(Plik);
  Seek(Plik, FileSize(Plik));

  for i:=1 to FileSize(p) do
  begin
    seek(Plik, I);
    read(P, Dane);
    write(Plik, Dane);
  end;

  Close(P);
end;

2. IDE

Korzystasz z TP7, czy uczysz się z jakiegoś 15-letniego kursu...? Jeśli tak, to zainstaluj sobie FPC i korzystaj z nakładke AssignFile i CloseFile, a także naucz się wykorzystywania bloków try .. finally .. end; Struktura tej procedury jest trochę niepoprawna, stąd trzeba będzie ją nieco przerobić;

3. Argumenty procedury

Tak, jak wspomniał @123oho - I po co ci p jako parametr? - wywal ten parametr; Zmienną plikową zadeklaruj lokalnie bo jak się domyślam zapewne jest globalna i dostępna dla wszystkich procedur/funkcji i bloku głównego w programie; Skoro program dzielisz na procedury/funkcje to i zestaw zmiennych/stałych przydziel dla konkretnych procedur (tylko dla tych, które ich wymagają);

Nie bardzo wiem co Ty w ogóle chcesz zrobić z tym plikiem; Parametr Pozycja niby określa miejsce skąd zacznie się kopiowanie rekordów, ale po co to już za bardzo nie wiem...

4. Podsumowanie

W treści tematu jest mowa o usuwaniu rekordów, z kodu wynika, że je kopiujesz z głównego do tymczasowego, przycinasz główny po czym z powrotem kopiujesz z tymczasowego do głównego (i to jeszcze z błedami, stąd crash) - jeśli dobrze zrozumiałem to ten kod służy jedynie marnowaniu czasu;

Najlepiej będzie jak napiszesz co w ogóle chcesz z tym plikiem i rekordami zrobić, bo jak na razie nie mam zielonego pojęcia co Tobie siedziało w głowie pisząc te instrukcje;

0
furious programming napisał(a):

korzystaj z nakładke AssignFile i CloseFile

Możesz wytłumaczyć dlaczego? Tak jak wspomniał @Patryk27 to są tylko nakładki, gdy piszę programy konsolowe używam Assign i Close bo jest krótsze i kompatybilne wstecznie.

W TP7 ZTCP nie było AssignFile ani CloseFile, stąd wolę stosować "nowinki", które Delphi/FPC/Lazarus wspierają od dawna i polecam ich stosowanie wszystkim;

FPC-DOC napisał(a)

AssignFile is completely equivalent to the system unit's Assign function

Żadne nowinki, wrappery, na dodatek niekompatybilne wstecznie z TP. Jak zwał tak zwał, robi to samo.
O ile Ty możesz używać czego chcesz, to jednak nie czepiałbym się tego, bo tutaj żadnego błędu ani niezalecanej konstrukcji nie ma (chociaż dzisiaj lepiej często użyć TFileStream który jest bardziej wszechstronny ale niezgodny z file).

Tak, jak wspomniał @123oho

Czy ja mam taki trudny nick? ;)

Najlepiej będzie jak napiszesz co w ogóle chcesz z tym plikiem i rekordami zrobić, bo jak na razie nie mam zielonego pojęcia co Tobie siedziało w głowie pisząc te instrukcje;

Zgaduję: Zachować wszystkie rekordy poza jednym (który się znajduje np. na środku).

0
-123oho napisał(a)

Możesz wytłumaczyć dlaczego? Tak jak wspomniał @Patryk27 to są tylko nakładki, gdy piszę programy konsolowe używam Assign i Close bo jest krótsze i kompatybilne wstecznie.

Ja rozumiem i wiem, że to są nakładki, tylko nie rozumiem dlaczego Ci zależy na kompatybilności wstecznej - wytłumacz jak możesz; Jeśli chodzi o to dlaczego ja z nich korzystam - dlatego, że wiele klas posiada metody Assign i w połączeniu z instrukcją wiążącą with .. do (a z niej korzystam zawsze) mogą się mylić;

-123oho napisał(a)

Czy ja mam taki trudny nick?

Zależy który; Z racji tej, że nie korzystam z kopiuj/wklej popełniłem zwykłą literówkę :]

Zgaduję: Zachować wszystkie rekordy poza jednym (który się znajduje np. na środku).

Hmmm... Rozmiar takiego pliku nie jest duży (skoro parametr Pozycja jest typu Byte), stąd wolałbym usuwanie reordu oprzeć choćby na macierzy dynamicznej - wczytać wszytkie, zapisać wybrane;

Patryk27 napisał(a)

O ile rekord ma stały rozmiar można by spróbować z TFileStream...

Zapewne ma i jest zapisywany tak, jak to przystało na kontrukcję typowego pliku rekordowego (typowanego), więc można użyć klasy TFileStream i elegancko wczytać co potrzeba, ustawić wskaźnik, usunąć co trzeba i zapisać strumień do tego samego pliku; Myślę, że to rozwiązanie będzie szybsze, a przy tym dość proste;


Wracając jeszcze do kodu:

Seek(Plik, Pozycja);

for I := 1 to FileSize(Plik) do
begin
  Read(Plik, Dane);
  Write(P, Dane);
end;

Skoro przesuwasz wskaźnik na wybraną pozycję, to ustaw początkowy indeks pętli także według wybranej pozycji;

0

dobra usuncie ten temat.. Kończe z tym..

0

nie rozumiem dlaczego Ci zależy na kompatybilności wstecznej - wytłumacz jak możesz

Czasami ktoś ode mnie np. chce program na TP. Zresztą nie o to chodzi. Chodzi o to że użycie assign wedle mnie nie jest błędem ani niezalecaną konstrukcją. Jest dokładnie tak samo poprawne jak twoja tylko że 'prawdziwa' bo AssignFile to wrapper na Assign.

Jeśli chodzi o to dlaczego ja z nich korzystam - dlatego, że wiele klas posiada metody Assign i w połączeniu z instrukcją wiążącą with .. do (a z niej korzystam zawsze) mogą się mylić;

Jak najbardziej jest to dopuszczalne i do tego przewidziane, ale ty też nie masz prawa się czepiać używania assign.

Zależy który; Z racji tej, że nie korzystam z kopiuj/wklej popełniłem zwykłą literówkę

Wszystkie mam chyba dosyć łatwe (łatwiejsze niż Tezca-cośtam AKA @MSM ). O dziwo mój nick często gubi minus...

dobra usuncie ten temat

Kolejny wandal uważa że tematy które stworzył należą tylko i wyłącznie do niego.

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