240 likes | 385 Views
Informatyka II MPZI2 sem.letni. Wykład 2. Obsługa plików. elementy. Pojęcie i istota stosowania. składowe takiego samego dowolnego typu - prostego, strukturalnego - nie pliki dostęp sekwencyjny - operacje np.: czytaj pierwszy | czytaj następny
E N D
Informatyka II MPZI2 sem.letni Wykład 2
Obsługa plików elementy Pojęcie i istota stosowania • składowe takiego samegodowolnego typu - prostego, strukturalnego - nie pliki • dostępsekwencyjny - operacje np.: • czytaj pierwszy | czytaj następny • zapisz na początku | zapisz na końcu • brak selektora (adresacji) • rozmiar dynamiczny • istnieje wewnętrzny wskaźnik elementu bieżącego, automatycznie modyfikowany po każdej operacji odczyt | zapis • fizycznie - w pamięci zewnętrznej: dysk, dyskietka, CD-ROM, - znakowe urządzenia wej/wyj: (monitor), drukarka
Uwagi: • Po otwarciu do odczytu wskaźnik ustawia się na początku pliku,każdy odczyt lub zapis przesuwa wskaźnik o jedną pozycję. • Otwarcie nowego (nieistniejącego) pliku powoduje utworzenie pustego pliku, jeśli plik istniał jego zawartość zostaje usunięta, • Można sprawdzić czy wskaźnik jest na końcu pliku • Można przewinąć wskaźnik na początek – jeśli wtedy stwierdzimy, że jesteśmy na końcu pliku to plik jest pusty, • Zapis nowego elementu zalecany tylko na końcu pliku (w środku można ale zmienimy (nadpiszemy) wartość elementu). • Dopisanie „w środku” pliku wykonuje się przez etapowe przepisywanie do innego pliku.
istotne cechy - gromadzenie dużej ilości informacji w sposób trwały - przenoszenie danych między programami | komputerami Dwa podstawowe typy plikowe textFile- plik tekstowy czyli file of string file ofTb -plik elementowy ( binarny, zdefiniowany ) o składowych typu Tb Wprowadza się tzw. zmienne plikowe służące do komunikowania programu z plikami fizycznymi • deklaracja: • var lista_nazw_zmiennych: Tp; • - Tp jest opisem typu plikowego lub nazwą typu • są to zmienne całościowe - reprezentują cały plik • nie ma zmiennych składowych - brak selektora elementu • są operacje dotyczące składowych pliku (procedury, funkcje), • korzystamy ze zmiennych odpowiadających składowym plików
Przykłady deklaracji zmiennych plikowych: type osoba = record nazw: string[ 20 ]; imie: array[1..2] of string[ 15 ]; data_ur: data; pensja: real end; dwa_napisy = array[1..2] of string[15]; //tablica var oceny: file ofreal; nazwiska: file ofstring[20]; zaloga: file ofosoba; adresy: file ofdwa_napisy; wyniki: textFile;
Reguły obsługi plików • opis zmiennych plikowych type osoba = .....; • var f: file of osoba; • skojarzenie - f ’d:\ścieżka\plik’ • otwarcie pliku f do - zapisu • - odczytu • - dodawania (tylko tekstowe) • operacje - zapis | odczyt • zamknięcie pliku f • ew. usunięcie pliku f | zmiana położenia (nazwy) Kolejność operacji na plikach: !!! • skojarzenie zmiennej plikowej z plikiem fizycznym • otwarcie pliku (do zapisu/odczytu) • operacje (czytanie, zapis) • zamknięcie
..istnieje grupa standardowych procedur i funkcji, m.in. • procedura: assignFile( f, Wt ) - skojarzenie zmienna plikowa tekstowy opis położenia na dysku np.: assignFile( grupa, ' C:\ROK_II\grupa_1.bin ' ); • procedura : reset( f ) - otwarcie do odczytu /zapisu (zastępowanie) - jeśli plik istnieje!!! - plik staje się aktywny - wskaźnik na początku pliku - gdy plik nie istnieje błąd wykonania • procedura : rewrite( f ) - otwarcie do zapisu - gdy plik nie istniał jest tworzony - gdy plik istniał jest zerowany - wskaźnik na początku pliku (końcu pustego)
procedura: append( f ) - otwarcie do zapisu na końcu pliku (tylko tekstowego) • procedura : closeFile( f ) - zamknięcie pliku - dopisuje zawartość bufora do pliku, zwalnia go - powinno odbyć przed zakończeniem programu • funkcja: eof( f ) - badanie końca pliku (end of file) - wartość logiczna: true - wskaźnik po ostatniej wartości (na końcu) false - wskaźnik w środku Także operacje systemu plików – np procedura erase(plik) – usunięcie pliku
odczyt z pliku • procedura : read( f, zmienna) f zmienna plikowa zmienna takiego samego typu jak element pliku zapis do pliku • procedura : write( f, zmienna ) Można korzystać z readln i writeln ale tylko dla zmiennych plikowych typu Textfile
Przykład: zapis tekstu do nowego pliku tekstowego program test; var p1:TextFile; z:string; begin z:='Jakis dowolny tekst'; Assignfile(p1,'a.txt'); rewrite(p1); //otwarcie pliku do zapisu writeln(p1,z); //zapis do pliku CloseFile(p1); end. nazwa fizycznego pliku (wraz z ewentualną ścieżką dostępu)
Przykład: zapis liczby do istniejącego pliku tekstowego program test; var p1:TextFile; z:real; begin z:=7.5; Assignfile(p1,'a.txt'); reset(p1); //otwarcie pliku do zapisu/odczytu writeln(p1,z:2:0); //wpisze do pliku 8 CloseFile(p1); end. nazwa fizycznego pliku (wraz z ewentualną ścieżką dostępu)
Przykład: odczyt liczby z pliku tekstowego program test; var p1:TextFile; z:real; begin Assignfile(p1,'a.txt'); reset(p1); readln(p1,z); //czytanie z pliku do zmiennej CloseFile(p1); writeln(z:10:3); //wypisze 8.000 readln end.
Jeśli więcej wierszy w pliku i nie wiemy ile, zwykle stosuje się konstrukcję program test; var p1:TextFile; z:real; begin Assignfile(p1,'a.txt'); reset(p1); while not eof(p1) do begin readln(p1,z); //czytanie z pliku do zmiennej writeln(z:10:3); //wpisze 8 end; CloseFile(p1); readln end. dopóki nie ma końca pliku wykonuj...
Przykład: Zapis do nowego pliku elementowego program test; type osoba= record nazwisko:string[20]; wzrost:integer; end; var p1:file of osoba; z:osoba; begin Assignfile(p1,'spis.bin'); rewrite(p1); z.nazwisko:='Kowalski'; z.wzrost := 180; write(p1,z); //wpisanie elementu do pliku CloseFile(p1); readln end.
Przykład: Zapis do istniejącego pliku elementowego program test; type osoba= record nazwisko:string[20]; wzrost:integer; end var p1:file of osoba;//zmienna plikowa z:osoba; //zmienna rekordowa begin Assignfile(p1,'spis.bin'); reset(p1); while not eof(p1) do read(p1,z); // czytanie do końca z.nazwisko:='Nowak'; z.wzrost := 190; write(p1,z); //wpisanie elementu do pliku CloseFile(p1); readln end.
Przykład: Odczyt z pliku elementowego program test; type osoba= record nazwisko:string[20]; wzrost:integer; end var p1:file of osoba; z:osoba; begin Assignfile(p1,'spis.bin'); reset(p1); while not eof(p1) do begin read(p1,z); // czytanie elemetu writeln(z.nazwisko:20, z.wzrost:6); end; CloseFile(p1); readln end.
Typ zbiorowy Typ zbiorowy to zbiór potęgowy danego typu porządkowego, czyli zbiór wszystkich podzbiorów tego typu. Zmienna typu zbiorowegomoże zatem zawierać zbiór pusty, jedno- lub wieloelementowy. Definicja typu zbiorowego: typenazwa_typu = set oftyp_porządkowy; typ zbiorowy typ bazowy • Liczba elementów nie może przekraczać 256 – czyli typ bazowy może być: • typem Byte (podtyp liczb całkowitych – zakres 0 do 255), • okrojonym całkowitym, np. 1..56 • znakowym (w tym okrojonym np. 'a'..'z') • wyliczeniowym • logicznym • Zmienna typu zbiorowego zawierać może dowolny podzbiór elementów typu bazowego, od zbioru pustego do zbioru zawierającego wszystkie elementy.
Czyli: Zmienna typu integer może mieć wartość 1 lub 100 a nie może jednocześnie 1 i 100! Zmienna typu wyliczeniowego może mieć jedną! z wyliczanych wartości Zmienna typu array może zawierać wiele wartości, ale zawsze ma statyczny rozmiar i nawet jak komórki są puste to rezerwują pamięć komputera Zmienna typu zbiorowego może zawierać zero, jedną lub wiele wartości z danego zbioru var zbior: set of1..100; Zmienne typu zbiorowego 1 5 7 19 4 8 34 67 69 88 100
Przykłady definicji typu zbiorowego: type dni = set of (pon,wto,sro,czw,pia,sob,nie) ; znaki = set of 'a'..'z' ; miesiac = (sty,lut,mar,kwi,maj,cze,lip,sie,wrz,paz,lis,gru) ; zbior_miesiecy = set of miesiac ; var nazwa_miesiaca : miesiac ;//zmienna typu wyliczeniowego zbior_nazw : zbior_miesiecy ;//zmienna typu zbiorowego wybrane_dni:dni; UWAGA: nazwa_miesiaca może przyjąć wartość tylko jednej z nazw – typ wyliczeniowy; zbior_nazw może przyjąć wartość dowolnego podzbioru z nazw bazowych – typ zbiorowy w bloku wykonawczym można…. begin nazwa_miesiaca:= sty; zbior_nazw:= [sty, lut, mar];
Zmiennych typu zbiorowego nie wolno używać w instrukcjach czytania i wyprowadzania wyników, używa się ich jedynie w operacjach wykonawczych, testujących itp. Operacje logiczne wykonywane na zbiorach to relacje (porównania): a = b równość zbiorów, te same elementy w obu zbiorach, a < > b różność zbiorów, różne elementy w obu zbiorach (chociaż niektóre mogą się powtarzać) a <= bzawieranie zbioru a w zbiorze b (true jeśli każdy element zbioru a jest w zbiorze b) a >= bzawieranie zbioru b w zbiorze a (true jeśli każdy element zbioru b jest w zbiorze a) cin a czy element c jest w zbiorze a
Stałe typu zbiorowego Wartości stałych typu zbiorowego zapisujemy w nawiasach kwadratowych w postaciach: [lista wartości podzbioru] np. [1, 5, 7], [okrojenie ze zbioru] np. [1..3], lub łącznie: np. [1..3, 5, 7], [ ] – zbiór pusty
Przykład 1: • type x=(alfa, beta, gamma, delta) ; {typ wyliczeniowy} • var z : set of x ; • begin • z := [alfa, beta] ; {lista - wybór podzbioru alfa, beta} • z := [alfa..gamma] ; {okrojenie - wybór podzbioru alfa, beta, gamma} • end;
Przykład 2: type miesiace = set of 1..12 ; var v, x, y, z: miesiace ; lit: char ; begin x :=[1..12] ; {cały rok} y := [1..6] ; {pierwsze półrocze} z := [1, 3, 5 , 7 , 8, 10, 12] ; {miesiące mające 31 dni} lit := 'a' ; if x<>y then writeln('tak') else writeln('nie'); {tak} if x<=y then writeln('tak') else writeln('nie'); {nie} if x>=y then writeln('tak') else writeln('nie'); {tak} if x = y then writeln('tak') else writeln('nie'); {nie} if 1 in x then writeln('tak') else writeln('nie'); {tak} if 9 in z then writeln('tak') else writeln('nie'); {nie} if lit in ['a'..'z'] then writeln('tak') else writeln('nie');{tak} end ;
Przykład 3: Czcionka var x: set of (italic, podgrubiony, podkreslony); Można: begin x:= []; x:= [italic,podkreslony]; x:= [italic,pogrubiony]; x:= [podkreslony]; …