[TP] Zapis rekordów do pliku amorficznego.

0

Mam do wykonania następujące ćwiczenie: program, który pozwoli użytkownikowi zapisać do pliku binarnego zdefiniowanego wybraną liczbę rekordów zawierających imię,nazwisko i wiek osoby, a następnie umożliwi wyszukiwanie tych rekordów po zawartości pola zawierającego nazwisko. Z plikiem binarnym zdefiniowanym sobie poradziłem:

program zad3;
uses crt;

type
typ = record
imie:string;
nazwisko:string;
wiek:byte;
end;
plik = file of typ;

var
p:plik;
t:typ;
s:byte;
n:string;

const
i1:typ=(imie:'Piotr';nazwisko:'Maslak';wiek:16);
i2:typ=(imie:'Damian';nazwisko:'Krawczyk';wiek:87);
i3:typ=(imie:'Daniel';nazwisko:'Kowalski';wiek:25);
i4:typ=(imie:'Waldemar';nazwisko:'Szary';wiek:43);
i5:typ=(imie:'Adam';nazwisko:'Kokoszka';wiek:57);

procedure wypisz(var F:plik);
var
r:typ;
begin
{$I-}reset(f);{$I+}
if IOResult <> 0 then exit;
while not eof(f) do
begin
read(f,r);
write(r.imie,' ',r.nazwisko,' ',r.wiek);
writeln;
end;
close(f);
end;

procedure app(var f:plik);
begin
{$I-}reset(f);{$I+}
if ioresult <> 0 then halt(1);
seek(f,filesize(f));
end;

procedure dopisz(var s:byte;var f:plik);
var
r:typ;
i:byte;
begin
app(f);
if ioresult <> 0 then exit;
for i:=1 to s do
begin
with r do
begin
writeln('Podaj imie');
readln(imie);
writeln('Podaj nazwisko');
readln(nazwisko);
writeln('Podaj wiek');
readln(wiek);
end;
write(f,r);
end;
close(f);
end;

procedure szukaj(n:string; var f:plik);
var
r:typ;
begin
{$I-}reset(f);{$I+}
if IOResult <> 0 then exit;
while not eof(f) do
begin
read(f,r);
if n=r.nazwisko then
begin
write(r.imie,' ',r.nazwisko,' ',r.wiek);
writeln;
end;
end;
close(f);
end;

begin
clrscr;
s:=0;
assign(p,'plik.dat');
{I-}rewrite(p);{I+}
if ioresult<>0 then exit;
write(p,i1);
write(p,i2);
write(p,i3);
write(p,i4);
write(p,i5);
close(p);
wypisz(p);
writeln;
writeln('Ile osob chcesz dopisac?');
readln(s);
if s<>0 then
begin
clrscr;
dopisz(s,p);
end
else
begin
writeln('Wybrales 0, program za 3 sekundy skonczy swoje dzialanie');
delay(3000);
exit;
end;
clrscr;
wypisz(p);
clrscr;
writeln('Szukane nazwisko');
readln(n);
writeln;
szukaj(n,p);
readln;

end.

Ale mam zrobić to samo, tylko używając pliku amorficznego. Nie wiem jak się za to zabrać, tak aby wprowadzać jak najmniej modyfikacji do poprzedniego programu.

0

Jeżeli chodzi o zapis i odczyt plików amorficznych (niezdefiniowanych), to zainteresuj się procedurami **BlockRead **i BlockWrite, bo ich powinieneś użyć. Czytaj, szukaj, myśl, stwórz jakiś kod i zapodaj go na forum, a na pewno pomożemy. Kod wklej w odpowiednie znaczniki (zaznaczasz cały w edytorze forum i naciskasz ikonę Kod źródłowy Delphi)!

Mam jeszcze uwagę do kodu, który przedstawiłeś. Czy on działa poprawnie? Mam podstawy sądzić, że jednak nie. Plik zdefiniowany, czyli wiadomo od którego bajtu zaczyna się każdy rekord. W Twoim programie ten warunek nie jest spełniony, bo łańcuchy nie mają określonej długości. Powinieneś je zadeklarować w postaci:

type
  TOsoba = record
    imie: string[20];
    nazwisko: string[50];
    wiek: Byte;
  end;
  TPlik: File of TOsoba;

var
  Plik: TPlik;
  Osoba: TOsoba;

Jak zauważyłeś zmieniłem nazwy typów i zmiennych, bo one powinny być sensowne i coś mówić gdy się spojrzy na kod

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