Datoteka je niz podataka istog tipa koji se čuva na spoljašnjoj memoriji, poput hard diska. Postoje dva osnovna tipa datoteka:
- Sekvencijalne datoteke – Podacima se pristupa redom kojim su upisani. Na primer, da bismo pročitali deseti podatak, moramo prvo pročitati svih devet pre njega.
- Datoteke sa direktnim pristupom – Podacima možemo direktno pristupiti navođenjem njihove pozicije.
U Pascalu se uglavnom koriste sekvencijalne datoteke. Da bismo radili sa datotekom, koristimo promenljivu tipa file of <tip podataka>
i izvršavamo sledeće korake:
- Dodela fizičke datoteke promenljivoj:
assign(f, 'ime_datoteke');
- Priprema za rad:
- Čitanje iz datoteke:
reset(f);
- Pisanje u datoteku (briše stari sadržaj):
rewrite(f);
- Čitanje iz datoteke:
- Čitanje i pisanje podataka:
- Pisanje:
write(f, podatak);
- Čitanje:
read(f, podatak);
- Pisanje:
- Zatvaranje datoteke:
close(f);
- Provera kraja datoteke:
if eof(f) then ...
program CitanjeIzDatoteke; type Osoba = record ime: string[20]; godine: integer; end; var f: file of Osoba; a: Osoba; begin assign(f, 'osobe.dat'); reset(f); while not eof(f) do begin read(f, a); writeln(a.ime, ' ima ', a.godine, ' godina.'); end; close(f); end.
Kako funkcionis
program CitanjeIzDatoteke;
type
Osoba = record
ime: string[20];
godine: integer;
end;
Osoba
je struktura (record) koja opisuje podatke o jednoj osobi.ime
je tekstualni podatak (do 20 karaktera).godine
je broj koji označava starost osobe.
var
f: file of Osoba;
a: Osoba;
f
je datoteka koja će čuvati podatke o osobama.a
je privremena promenljiva u koju ćemo smeštati podatke dok ih čitamo iz datoteke.
begin
assign(f, 'osobe.dat');
assign
povezuje datotekuf
sa fajlomosobe.dat
na disku.
reset(f);
reset
otvara datotekuf
za čitanje. Ako datoteka ne postoji, program će prijaviti grešku.
while not eof(f) do
begin
read(f, a);
writeln(a.ime, ' ima ', a.godine, ' godina.');
end;
while not eof(f)
znači “ponavljaj dok ne dođemo do kraja datoteke”.read(f, a)
čita sledeći zapis (jednu osobu) iz datoteke i smešta je u promenljivua
.writeln
prikazuje podatke o osobi (ime i godine) na ekranu.
close(f);
close(f)
zatvara datoteku kako bismo oslobodili resurse računara.
program UpisivanjeUDatoteku; type Osoba = record ime: string[20]; godine: integer; end; var f: file of Osoba a: Osoba; odgovor: string; begin assign(f, 'osobe.dat'); rewrite(f); repeat write('Unesi ime: '); readln(a.ime); write('Unesi godine: '); readln(a.godine); write(f, a); write('Da li želiš da uneseš još? (da/ne): '); readln(odgovor); until odgovor = 'ne'; close(f); end.
Kako funkcionise
program UpisivanjeUDatoteku;
type
Osoba = record
ime: string[20];
godine: integer;
end;
- Isto kao i kod čitanja, definišemo
Osoba
koja sadrži ime i godine.
var
f: file of Osoba;
a: Osoba;
odgovor: string;
f
je datoteka u koju ćemo čuvati podatke.a
je privremena promenljiva u koju unosimo podatke pre nego što ih upišemo u fajl.odgovor
je promenljiva za korisnikov unos (“da” ili “ne”).
begin
assign(f, 'osobe.dat');
assign
povezuje datotekuf
sa fajlomosobe.dat
na disku.
rewrite(f);
rewrite
otvara datotekuf
za pisanje. Ako datoteka već postoji, njen sadržaj će biti obrisan.
repeat
write('Unesi ime: ');
readln(a.ime);
- Program pita korisnika da unese ime i smešta ga u promenljivu
a.ime
.
write('Unesi godine: ');
readln(a.godine);
- Program traži od korisnika da unese godine i smešta ih u promenljivu
a.godine
.
write(f, a);
write(f, a)
upisuje podatke iz promenljivea
u datotekuf
.
write('Da li želiš da uneseš još? (da/ne): ');
readln(odgovor);
until odgovor = 'ne';
- Petlja se ponavlja dok korisnik ne unese “ne”.
- Ako korisnik odgovori “da”, program ponavlja unos podataka.
close(f);
- Na kraju,
close(f)
zatvara datoteku i čuva sve podatke u fajlu.
Tekstualna datoteka
Tekstualna datoteka je niz znakova (slova, brojeva, specijalnih znakova) zapisanih u ASCII formatu na nekom skladištu podataka, poput hard diska. Na primer:
- Veliko slovo A u tekstualnoj datoteci ima vrednost 65 (ASCII kod).
- Tekstualne datoteke se pišu i čitaju na način sličan radu sa ekranom i tastaturom.
U Pascalu, tekstualne datoteke se deklarišu sa rezervisanom reči text
.
var f: text;
Assign
Komanda assign
omogućava povezivanje promenljive tipa datoteke text
sa stvarnom datotekom koja se nalazi na disku. Nakon što povežemo promenljivu sa fajlom, možemo koristiti druge komande poput reset
, rewrite
, append
za otvaranje datoteke za čitanje, pisanje ili dodavanje podataka.
Sintaksa komande assign
assign(datoteka,'ime_datoteke');
program UpisUTXTDatoteku; var f: text; n, k, i, x: integer; begin assign(f, 'Matrica.txt'); writeln('Unesite n i k:'); read(n, k); rewrite(f); for i := 1 to n do begin read(x); write(f, x, ' '); if i mod k = 0 then writeln(f); end; close(f); end.
Kako funkcioniše:
- Deklaracija promenljivih:
f: text;
– Ovo je promenljiva koja predstavlja tekstualnu datoteku.n, k, i, x: integer;
–n
je broj brojeva koje želimo da unesemo,k
je broj brojeva koji treba da bude u svakom redu,i
je brojač za brojanje brojeva, ax
je promenljiva u koju unosimo brojeve sa tastature.
- Povezivanje sa datotekom:
assign(f, 'Matrica.txt');
– Ova komanda povezuje promenljivuf
sa datotekomMatrica.txt
na disku.
- Unos i upisivanje podataka:
writeln('Unesite n i k:');
– Ova komanda ispisuje poruku na ekranu, tražeći od korisnika da unese dva broja.read(n, k);
– Korisnik unosi dva broja:n
(ukupno brojeva koje želimo da unesemo) ik
(koliko brojeva treba da bude u svakom redu).rewrite(f);
– Otvaramo datoteku za pisanje. Ako datoteka već postoji, njen sadržaj će biti obrisan.
- Upisivanje brojeva u datoteku:
for i := 1 to n do
– Ova petlja ide od 1 don
(odnosno broji unete brojeve).read(x);
– Učitavamo broj sa tastature i smeštamo ga u promenljivux
.write(f, x, ' ');
– Upisujemo brojx
u datoteku, sa razmakom između brojeva.if i mod k = 0 then writeln(f);
– Ako je broj brojeva upisanih do sada deljiv sak
, program prelazi u novi red u datoteci.
- Zatvaranje datoteke:
close(f);
– Zatvaramo datoteku nakon što su svi brojevi upisani.
program Ucitavanje; const MAX_REDOVA = 100; MAX_KOLONA = 100; var f: text; a: array[1..MAX_REDOVA, 1..MAX_KOLONA] of integer; i, j: integer; begin assign(f, 'Matrica.txt'); reset(f); i := 1; while not eof(f) do begin j := 1; while not eoln(f) do begin read(f, a[i, j]); write(a[i, j], ' '); j := j + 1; end; readln(f); writeln; i := i + 1; end; close(f); end.
Kako funkcioniše:
- Deklaracija promenljivih:
f: text;
– Promenljiva koja predstavlja tekstualnu datoteku.a: array[1..MAX_REDOVA, 1..MAX_KOLONA] of integer;
– Ovo je matrica koja će sadržati brojeve učitane iz datoteke.MAX_REDOVA
iMAX_KOLONA
su maksimalni brojevi redova i kolona koje možemo imati.i, j: integer;
–i
je brojač redova, aj
je brojač kolona.
- Povezivanje sa datotekom:
assign(f, 'Matrica.txt');
– Ova komanda povezuje promenljivuf
sa datotekomMatrica.txt
na disku.reset(f);
– Otvaramo datoteku za čitanje.
- Učitavanje podataka iz datoteke:
i := 1;
– Počinjemo sa prvim redom.while not eof(f) do
– Petlja se izvršava dok ne dođemo do kraja datoteke.j := 1;
– Počinjemo sa prvom kolonom u svakom redu.while not eoln(f) do
– Petlja se ponavlja dok ne dođemo do kraja reda u datoteci.read(f, a[i, j]);
– Čitamo broj iz datoteke i smeštamo ga u matricua
na odgovarajući red i kolonu.write(a[i, j], ' ');
– Ispisujemo broj na ekranu, odvajajući brojeve razmakom.j := j + 1;
– Povećavamo brojač kolona.readln(f);
– Prelazimo u novi red u datoteci.writeln;
– Prelazimo u novi red na ekranu.i := i + 1;
– Povećavamo brojač redova.
- Zatvaranje datoteke:
close(f);
– Zatvaramo datoteku nakon što su svi podaci učitani.