oto program ktory ma opcje dopisywania rekordow sortujac, wypisywania wszystkich, oraz wyszukiwania rekordow. Blad objawia sie tym ze jezeli chce otworzyc juz istniejacy plik to program sie konczy... nie mam pojecia dlaczego.. oto kod
[CODE]with ada.text_Io, ada.integer_text_io, ada.direct_io;
use ada.text_Io, ada.integer_text_io;
procedure zad1zaj2 is
n:natural;
wskaznik,nr:integer;
type abonent is record
imie,nazwisko: string(1..40):=(others=>' ');
pesel:string(1..11):=(others=>' ');
telefon_sta,telefon_kom:integer;
end record;
package Pabonent is new ada.direct_io(abonent);
use Pabonent;
plik:Pabonent.File_Type;
nazwa:string(1..50):=(others=>' ');
os,os1,os2:abonent;
procedure pobierzdane (os: out abonent) is
begin
put("Podaj imie osoby: ");
get_line(os.imie,n); skip_line;
put("Podaj nazwisko osoby: ");
get_line(os.nazwisko,n);
put("Podaj pesel osoby: ");
get_line(os.pesel,n);
put("Podaj telefon stacjonarny osoby: ");
get(os.telefon_sta);
put("Podaj telefon komorkowy osoby: ");
get(os.telefon_kom);
skip_line;
end;
procedure wypiszdane (os: in abonent) is
begin
put("imie osoby: ");
put(os.imie); new_line;
put("nazwisko osoby: ");
put(os.nazwisko); new_line;
put("pesel osoby: ");
put(os.pesel); new_line;
put("telefon stacjonarny osoby: ");
put(os.telefon_sta); new_line;
put("telefon komorkowy osoby: ");
put(os.telefon_kom); new_line;
end;
procedure wyszukiwarka (os2: in abonent ) is
xxx: ABONENT;
begin
reset(plik,in_file);
while not end_of_file(plik) loop
read(plik,xxx);
if os2.nazwisko = xxx.nazwisko and os2.imie=xxx.imie then
wypiszdane(xxx);
end if;
end loop;
end;
procedure pobierz_sortuj (os: out abonent) is
begin
pobierzdane(os1);
if size(plik) = 0 then
reset(plik,out_file);
write(plik,os1,size(plik)+1);
else
wskaznik:=0;
reset(plik,in_file);
while not end_of_file(plik) loop
read(plik,os);
if os1.nazwisko < os.nazwisko then
wskaznik:=integer(index(plik));
exit;
end if;
end loop;
-- if dla roznych wskaznikow
if wskaznik = 0 then
reset(plik,out_file);
write(plik,os1,size(plik)+1);
else
for k in reverse (wskaznik-1)..integer(size(plik)) loop
reset(plik,in_file);
read(plik,os,Pabonent.count(k));
reset(plik,out_file);
write(plik,os,Pabonent.count(k+1));
end loop;
reset(plik,out_file);
write(plik,os1,Pabonent.count(wskaznik-1));
end if;
end if;
end;
procedure wypisz (os: out abonent) is
begin
reset(plik,in_file);
while not end_of_file(plik) loop
read(plik,os);
wypiszdane(os);
new_line(2);
end loop;
end;
-- KONIEC CZESCI DEKLARACYJNEJ
begin
put("Podaj nazwe pliku na ktorym ma byc wykonana operacja: ");
get_line(nazwa,n);
open(plik,out_file,nazwa(1..n));
exception when Pabonent.name_error =>
create(plik,out_file,nazwa(1..n));
nr:= 0;
put_line("Prosze wybrac operacje: ");
put_line("1 zeby dopisac abonenta do ksiazki telefonicznej");
put_line("2 dla odczytu ksiazki telefonicznej");
put_line("3 zeby wyszukac osobe w ksiazce telefonicznej");
get(nr);
if nr = 1 then
pobierz_sortuj(os);
end if;
if nr = 2 then
new_line;
wypisz(os);
end if;
if nr = 3 then
Os:=(Telefon_Sta=>0,Telefon_Kom=>0,OTHERS=>(OTHERS=>' ')) ;
GET_LINE(OS.NAZWISKO,N);
GET_LINE(OS.imie,N);
wyszukiwarka(os);
end if;
reset(plik,in_file);
close(plik);
end zad1zaj2;
[/CODE]