Operacje plikowe: zapamiętywanie danych na dysku i odczyt z dysku

 

Zapamiętanie danych na dysku wiąże się ze strukturalnym typem danych – typem plikowym.

Plik to uporządkowany zbiór danych.
Jeśli chcemy, aby program zapisywał coś do pliku lub odczytywał z pliku to trzeba przede wszystkim określić jego typ.
Wyróżniamy 3y typy plików: tekstowe, rekordowe  i luźne [amorficzne]

 

Typ plikowy predefiniowany nosi nazwę TEXT.
Pliki tekstowe, jak sama nazwa wskazuje zawierają głownie tekst i są najprostsze do odczytu i zapisu,
gdyż używa się do tego zwykłych poleceń

readln, read, write, writeln.

 

Pliki rekordowe to takie, które składają się tylko z jednego typu zmiennych
(np. byte, lub  record of ...) powielonego wiele razy.
(np. jeden taki plik może mieć zapisanych w sobie 400 bajtów, 500 razy string[10], lub 30 record of ... ,
lecz nie może mieć tego wszystkiego na raz.)
Taki typ plików jest idealny do bazy danych.

 

Typ luźny zawiera w sobie mieszaninę różnych typów.
Pliki tego typu to na przykład BMP, czy CHR [i miliony innych, bo z takiego typu pliku się najczęściej korzysta.
Aby mieć dostęp do jakiegokolwiek pliku należy najpierw go przypisać do jakiejś zmiennej i otworzyć.
Po zakończeniu pracy z plikiem, trzeba go plik zamknąć.

Pliki tekstowe:

Każda zmienna odpowiadająca za plik tekstowy ma typ text:

var zmienna_plikowa:text;
np. var f: text;
Aby przypisać plikowi dowolnego typu zmienna należy użyć polecenia
assign(zmienna_plikowa,nazwapliku):
np. assign(f,'jakas_nazwa.txt');

W zależności od tego, co zamierzmy robić z plikiem należy go otworzyć odpowiednim poleceniem:

reset(zmienna_plikowa);       {Jeśli chcemy czytać z pliku}
rewrite(zmienna_plikowa);     {Jeśli chcemy zapisać cos do pliku; ta operacja skasuje jego zawartość}
append(zmienna_plikowa);      {Jeśli chcemy dopisać cos na końcu pliku}

Do odczytywania pliku tekstowego wystarcza read i readln z jednym dodatkowym parametrem.
Gdy jako pierwszy parametr read'a podasz zmienną plikową,

Przykład

Załóżmy, ze chcemy odczytać 2 pierwsze linijki z pliku plik1.txt:


Program Pltekst1;
var
 f:text; {deklaracja pliku tekstowego}
 s:string; {zmienna – łańcuch znaków – cała linia}

begin
assign(f,'plik1.txt');
reset(F);    {Otwieramy plik do odczytu}
readln(f,s); {Odczytujemy pierwsza linijkę}
writeln(s);  {Wyświetlamy ją}
readln(f,s); {Odczytujemy druga linijkę}
writeln(s);  {Wyświetlamy ja}
close(f);    {Zamykamy plik}
end.

Tak odczytuje się plik tekstowy linijka po linijce.

Wyświetlenie zawartość pliku tekstowego – przy  pomocy pętli

Program Pltekst2;
Uses crt;
var
 f:text; {deklaracja pliku tekstowego}
 s:string; {zmienna - łańcuch znaków - cała linia}
 nazwapliku: string;
 
Begin
Clrscr;
Write('Podaj nazwę plu do odczytu: '); readln(nazwapliku);
assign(f, nazwapliku);
reset(F);    {Otwieramy plik do odczytu}
while not eof(f) do 
begin
  readln(f,s);
  writeln(s);
end;
close(f);
readln;
end.

 

Plik typu text możemy odczytywać też porcjami danych, np. litera po literze, lub po 10 liter.
Używamy do tego read(f,x).
Procedura ta nie przezuca kursora plikowego na nastepna linijke:

 
Program Pltekst3;
Uses crt;
var
 f:text; {deklaracja pliku tekstowego}
 ch:char; {zmienna - znak}
 nazwapliku: string[15];
 
Begin
Clrscr;
Write('Podaj nazwę plu do odczytu: '); readln(nazwapliku);
assign(f, nazwapliku);
reset(F);    {Otwieramy plik do odczytu}
while not eof(f) do 
begin
  read(f,ch);
  write(ch);
end;
close(f);
readln;
end.

 

Zapis plików tekstowych.

 

Stosujemy polecenia
write(zmienna_plikowa, lista_argumentow_wyjsciowych)

Lub

writeln(zmienna_plikowa, lista_argumentow_wyjsciowych)

Gdzie zmienna plikowa określa plik tekstowy

 

Program Pltekst4;

Uses crt;

var

 f:text; {deklaracja pliku tekstowego}

 s:string; {zmienna - łańcuch znaków - cała linia}

 nazwapliku: string;

Begin

Clrscr;

Write('Podaj nazwę pliku do zapisu: '); readln(nazwapliku);

assign(f, nazwapliku);

rewrite(F);    {Otwieramy plik do zapisu}

{appena(f); - dopisywałby do pliku istniejącego}

writeln('Wpisuj kolejne linie tekstu i Enter');

writeln('Sam Enter konczy pisanie');

repeat

  readln(s);

  writeln(f,s);

until s='';

close(f);

end.

 

Pliki rekordowe

Typem pliku rekordowego jest file of typ_zmiennej
Np.: pliki file of byte (zawierajace ileś bajtów),
file of string[10], zawierające  napisy złożone z 10 znaków,
file of record
x,y:integer;c:byte;end;

Przykład
type Osoba=record
    Nazwisko:string[20];
    Imie:string[15]; 
    telefon:longint;
  end;

var f:file of Osoba;
  o:Osoba;



Przy obsłudze plików rekordowych przydają sie dwa polecenia - read, oraz write.
Readln, oraz Writeln na nic sie nie przydają, gdyż w tego typu plikach nie rozróżniamy linijek.
Zadanie: Zapiszmy do pliku dane dwóch osób:

Program Plikrek1;
type Osoba=record
    Nazwisko:string[20];
    Imie: string;
    telefon:longint;
  end;
var f:file of Osoba;
  o:Osoba;
begin
  assign(f,'Dane.osb');
  rewrite(f);
  O.Nazwisko:='Kowalski'; O.Imie:=’Jan’;
  O.Telefon:=22345671;
  write(f,o);
  O.Nazwisko:='Dulski'; O.Imie:=’Cezary’;
  O.Telefon:=665873211;
  write(f,o);
  close(f);
end.


A teraz je odczytajmy:

Program Plikrek2;

uses crt;

type Osoba=record

    Nazwisko:string[20];

    Imie: string;

    telefon:longint;

  end;

var f:file of Osoba;

  o:Osoba;

begin

clrscr;

 assign(f,'Dane.osb');

  reset(f);

  read(f,o);

  writeln(o.Nazwisko+'  ',o.Imie+'  Tel ', o.telefon);

  read(f,o);

  writeln(o.Nazwisko+'  ',o.Imie+'  Tel ', o.telefon);

  close(f);

  readln;

end.


Istnieje jednak dosyć duża różnica miedzy plikami tekstowymi, a rekordowymi.
W przypadku plików rekordowych kursor plikowy można przesuwać do przodu
i do tylu w pliku, a nie tylko do przodu.
Używamy polecenia seek(f,x),
gdzie x jest numerem rekordu, na którym ustawi sie kursor.
Poza tym instrukcja reset(f) nie otwiera juz pliku tylko do odczytu, ale także i do zapisu.
Dzięki temu można stworzyć łatwo prosta bazę danych:

Program Bazdan;

uses crt;

type Osoba=record

    Nazwisko:string[20];

    Imie: string;

    telefon:longint;

  end;

 

var

  ilosc: integer;

  f:file of Osoba;

  o:Osoba;

  x:word;

 

begin

  clrscr;

  assign(f,'Dane.osb');

  reset(f);

  writeln('Licze rekordy ');

  while (not eof(f)) do

   begin

    read(f,o);

    inc(ilosc) ;

    writeln('Rekord nr ', ilosc);

   end;

  writeln('Ilosc rekordow ', ilosc);

  write('Podaj numer rekordu od 0 do ',ilosc-1,' : ');

  readln(x);

  seek(f,x);

  read(f,o);

  writeln(o.Nazwisko+'  ', o.Imie+ '  Tel.  ',o.telefon);

  writeln('Podaj nowy numer telefonu :');

  readln(o.telefon);

  seek(f,x); {musimy wrocic do tego rekordu, bo read przeniosło nas do nastepnego}

  write(f,o);

  close(f);

 

end.

 

Przykładowy program z bazą danych

{ Program "fragment_2_baza_danych"               }

 { Copyright (C) by Wincenty Kadłubek 2006 - 2008 }

 { Ten plik został ściągnięty ze strony:          }

 {   www.pascal.yoyo.pl                           }

 { Kontakt z autorem:                             }

 {   wincenty.kadlubek@gmail.com                  }

 { Autor programu udostępnia poniższy kod na      }

 { licencji GNU GPL v3 pod warunkiem, że ten      }

 { nagłówek nie zostanie usunięty.                }

 

 

 Type

  tBFile = File Of tBKsiazka;

 { ... }

 

 Var

  Wybor  : Char;

 

   Procedure Otworz;

    Var

     F : tBFile; { Ten typ powinien być zadeklarowany wcześniej }

   Begin

    Write('Podaj nazwę pliku z bazą danych (ENTER - nowa baza)... ');

    ReadLn(Nazwa);

     If (Nazwa<>'') Then

        Begin

         Assign(F, Nazwa); { Otwieramy plik o nazwie S }

         ReSet(F);         { Przygotowujemy plik do odczytu }

          While (Not EoF(F)) Do { EoF(F: File) zwraca True jeśli jesteśmy }

                Begin           { na końcu pliku }

                 Read(F, Baza[Ilosc]); { Czytamy zmienną z pliku F }

                 Inc(Ilosc);

                End;

         Close(F);         { Na koniec zamykamy plik }

        End;

   End;

  

  

   Procedure Zapisz;

    Var

     F : tBFile;

     I : Word;

   Begin

     If (Nazwa='') Then

        Begin

         Write('Podaj nazwę pliku, do którego chcesz zapisać bazę... ');

         ReadLn(Nazwa);

        End;

    Assign(F, Nazwa); { Otwieramy plik }

    ReWrite(F);       { Czyścimy plik i przygotowujemy do zapisu }

     For I:=0 To Ilosc-1 Do

         Write(F, Baza[I]); { Zapisujemy zmienną do pliku F }

    Close(F);         { Zamykamy plik }

   End;

 

   { Inne procedury }

 

Begin

 Ilosc:=0; { Czyścimy bazę danych }

 WriteLn('Witaj w Prostej Bazie Danych!');

 Otworz;   { Wczytujemy bazę z pliku }

  Repeat

   WriteLn;

   WriteLn('Co chcesz zrobić?');

   WriteLn(' 1. Pokazać rekord(y)');

   WriteLn(' 2. Edytować rekord');

   WriteLn(' 3. Dodać nowy rekord');

   WriteLn(' 4. Usunąć rekord(y)');

   WriteLn(' 5. Zapisać pracę i zakończyć działanie programu');

   Write('Twój wybór [1-5]... ');

   ReadLn(Wybor);

   WriteLn;

    Case (Wybor) Of

     '1' : Pokaz;

     '2' : Edytuj;

     '3' : Dodaj;

     '4' : Usun;

     '5' : { Nic };

     Else  WriteLn('Nie ma takiej opcji');

    End;

  Until (Wybor='5');

 Zapisz;   { Zapisujemy bazę }

 WriteLn('Dziękujemy za korzystanie z programu PBD.');

End.