Wykład 8
Download
1 / 21

Wykład 8 - PowerPoint PPT Presentation


  • 100 Views
  • Uploaded on

Wykład 8. Pliki. Obsługa plików 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 zapisz na początku | zapisz na końcu brak selektora (adresacji)

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about ' Wykład 8' - tulia


An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript

Wykład 8

Pliki


Obsługa plików

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.


- gromadzenie dużej ilości informacji

- w sposób trwały

- przenoszenie danych między programami | komputerami

Opis typu plikowego

textFile - plik tekstowy

file ofTb - plik elementowy ( binarny, zdefiniowany ) o składowych typu Tb

file - plik blokowy ( binarny, niezdefiniowany ) – nie będziemy się zajmować

Zmienne plikowe

  • deklaracja:

    var lista_nazw_zmiennych: Tp;

    - Tp jest opisem typu plikowego lub nazwą typu

  • są zmienne całościowe - reprezentują cały plik

  • nie ma zmiennych składowych - brak selektora

  • są operacje dotyczące składowych pliku (procedury, funkcje)

    - korzystają ze zmiennych odpowiadających składowym plików


Przykład:

type osoba = record

nazw: string[ 20 ];

imie: array[1..2] of string[ 15 ];

data_ur: data;

pensja: real

end;

dwa_napisy = arrray[1..2] of string[15];

var oceny: file ofreal;

nazwiska: file ofstring[20];

zaloga: file ofosoba;

adresy: file ofdwa_napisy;

wyniki: textFile;

obraz: file;


Reguły obsługi plików

  • opis zmiennych plikowych type osoba = .....;

    var grupa: 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

  • usunięcie pliku f | zmiana położenia (nazwy)

Kolejność operacji na plikach:

!!!

  • skojarzenie zmiennej plikowej z plikiem fizycznym

  • otwarcie pliku (do zapisu lub odczytu)

  • operacje (czytanie, zapis)

  • zamknięcie


  • p: assignFile( f, Wt ) - skojarzenie

zmienna plikowa

tekstowy opis położenia na dysku

np.: assignFile( grupa, ' C:\ROK_II\grupa_1.bin ' );

  • p: 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

  • p: 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)


  • p: append( f ) - otwarcie do zapisu na końcu pliku (tylko tekstowego)

  • p: closeFile( f ) - zamknięcie pliku

- dopisuje zawartość bufora do pliku, zwalnia go

- powinno odbyć przed zakończeniem programu

  • f: 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


procedure TForm1.Button1Click(Sender: TObject);

var plik: textFile;

begin

openDialog1.title := 'Usuwanie pliku';

openDialog1.filter := 'Tekstowe(*.txt)|*.txt';

if openDialog1.execute then

begin

assignFile( plik, openDialog1.fileName );

try

if FileExists(openDialog1.fileName) then

begin

if MessageDlg( 'Usunąć ' + openDialog1.fileName + '?',mtConfirmation, [mbYes, mbNo], 0) = mrYes

then erase( plik)

end

else ShowMessage( 'Nie ma');

except

ShowMessage( 'Błąd operacji usunięcia pliku.');

end;

end;

end;

konieczny BEGIN..END aby było wiadomo do którego if jest else


Obsługa plików tekstowych

  • opis typu plikowegotextFile

  • assignFile, reset, rewrite, closeFile

p: append( f ) - otwarcie do zapisu na końcu pliku tekstowego !!!

  • czytaniez pliku

    - read( zmienna_plikowa, Z1, Z2,... Zn) czyta ile trzeba i "czeka"

    • - readln( zmienna_plikowa, Z1, Z2,... Zn)czyta ile trzeba i przesuwa na koniec wiersza

do zmiennych typu składowego:

integer, real, char, string

skąd

- czytanie z pliku do zmiennych w pamięci operacyjnej

- dla integer, real, string - konwersja

- każdy odczyt  przesunięcie wskaźnika

funkcja SeekEoln( zmienna_plikowa ) -  wskaźnik po końcu wiersza


procedure TForm1.Otw_plikClick(Sender: TObject);

var pl_wej: TextFile;

nazwa_pl, wiersz: String;

begin

openDialog1.title := 'Plik do edycji';

openDialog1.filter := 'Delhi(*.pas, *.dpr)|*.pas;*.dpr';

if OpenDialog1.Execute then begin

nazwa_pl := OpenDialog1.FileName;

AssignFile( pl_wej, nazwa_pl );

Reset( pl_wej );

while not Eof( pl_wej ) do begin

Readln( pl_wej, wiersz );

Memo1.Lines.Add( wiersz );

end;

CloseFile( pl_wej );

Form1.Caption := 'Edycja pliku [ ' + nazwa_pl + ' ]';

end;

end;

dopóki nie ma końca pliku


- write( zmienna_plikowa, W1, W2,... Wn)

- writeln( zmienna_plikowa, W1, W2,... Wn)

co - wyrażenia typu składowego

gdzie

Wi - wyrażenia typu: integer, real, char, string, array of char, TStrings

+ format wyniku

tak

:szerokość pola

:m

lub tak

:m:n

:szerokość_pola:liczba_cyfr_dziesiętnych

  • dopisywać można tylko na końcu pliku

    - jest tak po rewrite

    - gdy po reset  trzeba przewinąć na koniec

  • zapis ustawia wskaźnik po zapisanym tekście

Jeśli chcemy dopisać nowy element w środku pliku (lub skasować) to potrzebne operacje na dwóch plikach – etapowe przepisywanie


Przykład: Zapis liczby do pliku tekstowego

var p1:TextFile;

z:real;

begin

z:=7.5;

Assignfile(p1,'a.txt');

rewrite(p1);

writeln(p1,z:2:0); //wpisze 8

CloseFile(p1);

end;


procedure TForm1.Zap_jakoClick(Sender: TObject);

var pl_wyj: TextFile;

nazwa_pl: String; k:integer;

begin

SaveDialog1.title := 'Plik do zapisu';

SaveDialog1.filter := 'tekst ASCII|*.txt';

if SaveDialog1.Execute then begin

nazwa_pl := SaveDialog1.FileName;

AssignFile( pl_wyj, nazwa_pl ); // nowy

Rewrite( pl_wyj );

Writeln( pl_wyj , Memo1.Text ); // przepisywanie

//można też for k:=0 to Memo1.Lines.Count-1 do writeln(pl_wyj,Memo1.Lines[k]);CloseFile( pl_wyj );

Form1.Caption := 'Edycja pliku [ ' + nazwa_pl + ' ]';

end;

end;


  • Przykład– Plik tekstowy – zapis do pliku z formatowaniem

procedure TForm1.Zap_jakoClick(Sender: TObject);

var pl_wyj: TextFile;

nazwa_pl, wiersz: String;

k: integer;

x: real;

begin

SaveDialog1.title := 'Plik do zapisu';

SaveDialog1.filter := 'tekst ASCII|*.txt';

if SaveDialog1.Execute then begin

nazwa_pl := SaveDialog1.FileName;

AssignFile( pl_wyj, nazwa_pl ); // nowy

Rewrite( pl_wyj );

for k := 0 to Memo1.Lines.Count – 1 do

Writeln( pl_wyj , Memo1.Lines[k]:20 ); // przepisywanie

CloseFile( pl_wyj );

Form1.Caption := 'Edycja pliku [ ' + nazwa_pl + ' ]';

end;


Błędy operacji plikowych

  • 100 Disk read error próba czytania po końcu pliku

  • Disk write error np. dysk pełny

  • File not assigned brak skojarzenia assignfile

  • File not open brak otwarcia

  • File not open for input brak otwarcia do odczytu

  • 105 File not open for output brak otwarcia do zapisu

  • Invalid numeric format nieprawidłowy format liczby


Obsługa plików elementowych (binarnych)

  • opis typu plikowego

  • file of Tb - Tb jest typem bazowym (typ zapisywanego elementu)

  • deklaracja, skojarzenie, otwarcie i zamknięcie - jak dla plików tekstowych

  • operacje edycyjne:

    • czytanie z pliku - read( zmienna_plikowa, Z1, Z2,... Zn )

      Zi - nazwy zmiennych typu bazowego

    • zapis do pliku - write( zmienna_plikowa, W1, W2,... Wn)

  • Wi - wyrażenia typu bazowego

Przykład: var student: osoba;

f: file of osoba;

begin

assignFile( f, 'nazwa ze ścieżką' );

reset( f );

read( f, student )

UWAGA!! czytamy w pliku i zapisujemy do pliku cały element!!!

Tylko read i write (nie ma readln i writeln)


FUNKCJE POMOCNICZE

- Eof( zmienna_plikowa ):Boolean - badanie końca pliku

  • Eoln( zmienna_plikowa ):Boolean - badanie końca wiersza

  • FileExists(plik:string ):Boolean - badanie czy plik istnieje

przykład:

if eof(grupa) then ...

  • FilePos(plik):Integer - pozycja elementu (od 0)

  • - FileSize(plik):Integer - liczba elementów

PROCEDURY POMOCNICZE

Truncate( zmienna_plikowa )- kasowanie pliku od pozycji bieżącej do końca

Seek( zmienna_plikowa, numer) - ustawienie przed elementem numer (od 0)

SeekEof( zmienna_plikowa ) - ustawienie wskaźnika na końcu pliku

przykład:

SeekEof (grupa);

też erase(zm_pl) i rename(zm_pl,nowa_nazwa:string)


Przykład – wpisanie elementu do pliku nowego i istniejącego:

type osoba = record nazw:string{20], imie:string[15] ; end;;

var student, rob: osoba;

f1, f2: file of osoba;

begin

assignFile( f1, '....' ); assignFile( f2, '....' );

with student do begin

nazw := 'Kowalski';

imie := 'Jan';

end; // with

rewrite( f1 ); //nowy plik

write ( f1, student ); // zapis do nowego

reset( f2 ); //stary plik

while not eof( f2) do read( f2, rob ); // przewijanie do konca

write ( f2, student ); // zapis na koniec

closeFile(f1); closeFile(f2);

end;


Przykład – czytanie z pliku:

type osoba = record nazw:string{20], imie:string[15] ; end;;

var student, rob: osoba; k:integer;

f: file of osoba;

begin

assignFile( f, '....' );

reset( f );

for k:=1 to 14 do read (f, student); // przewijanie do 15 elementu

read ( f, student ); // przeczytanie 15-go elementu

Edit1.Text :=student.nazw; //przepisanie do Edit nazwiska 15-go studenta

Edit2.text:=student.imie;

closeFile(f);

end;

lub można użyć procedury Seek(f,14)

... bo od 0 liczymy


Uwagi końcowe

Uważać na kolejność czynności przy obsłudze typu plikowego

Dobrze i wygodnie operuje się na pliku znając zestaw procedur i funkcji standardowych

Do usuwania czy też zmiany nazwy pliku też wymagane jest skojarzenie AssignFile

Nie zapominać o zamknięciu CloseFile

Odróżniać reset od rewrite oraz read od write

Niestety nie można w plikach tekstowych w prosty sposób zamieniać tekstów – trzeba używać drugiego pliku. W plikach elementowych jest to możliwe i dlatego poleca się stosowanie typu file of string zamiast TextFile

książka adresowa


ad