bt_bb_section_bottom_section_coverage_image

Datoteke

Šta su datoteke?

Datoteka je niz podataka istog tipa koji se čuva na spoljašnjoj memoriji, poput hard diska. Postoje dva osnovna tipa datoteka:

  1. 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.
  2. 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:

  1. Dodela fizičke datoteke promenljivoj:
    assign(f, 'ime_datoteke');
    
  2. Priprema za rad:
    • Čitanje iz datoteke:
      reset(f);
      
    • Pisanje u datoteku (briše stari sadržaj):
      rewrite(f);
      
  3. Čitanje i pisanje podataka:
    • Pisanje:
      write(f, podatak);
      
    • Čitanje:
      read(f, podatak);
      
  4. Zatvaranje datoteke:
    close(f);
    
  5. Provera kraja datoteke:
    if eof(f) then ...
Čitanje podataka iz datoteke
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 datoteku f sa fajlom osobe.dat na disku.

reset(f);
  • reset otvara datoteku f 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 promenljivu a.
  • writeln prikazuje podatke o osobi (ime i godine) na ekranu.

close(f);
  • close(f) zatvara datoteku kako bismo oslobodili resurse računara.

Upisivanje podataka u datoteku
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 datoteku f sa fajlom osobe.dat na disku.

  rewrite(f);
  • rewrite otvara datoteku f 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 promenljive a u datoteku f.

    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

Šta je 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 textsa 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');
Upisivanje u datoteku
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:

  1. 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, a x je promenljiva u koju unosimo brojeve sa tastature.
  2. Povezivanje sa datotekom:
    • assign(f, 'Matrica.txt'); – Ova komanda povezuje promenljivu f sa datotekom Matrica.txt na disku.
  3. 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) i k (koliko brojeva treba da bude u svakom redu).
    • rewrite(f); – Otvaramo datoteku za pisanje. Ako datoteka već postoji, njen sadržaj će biti obrisan.
  4. Upisivanje brojeva u datoteku:
    • for i := 1 to n do – Ova petlja ide od 1 do n (odnosno broji unete brojeve).
    • read(x); – Učitavamo broj sa tastature i smeštamo ga u promenljivu x.
    • write(f, x, ' '); – Upisujemo broj x u datoteku, sa razmakom između brojeva.
    • if i mod k = 0 then writeln(f); – Ako je broj brojeva upisanih do sada deljiv sa k, program prelazi u novi red u datoteci.
  5. Zatvaranje datoteke:
    • close(f); – Zatvaramo datoteku nakon što su svi brojevi upisani.
Čitanje iz datoteke
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:

  1. 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 i MAX_KOLONA su maksimalni brojevi redova i kolona koje možemo imati.
    • i, j: integer;i je brojač redova, a j je brojač kolona.
  2. Povezivanje sa datotekom:
    • assign(f, 'Matrica.txt'); – Ova komanda povezuje promenljivu f sa datotekom Matrica.txt na disku.
    • reset(f); – Otvaramo datoteku za čitanje.
  3. 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 matricu a 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.
  4. Zatvaranje datoteke:
    • close(f); – Zatvaramo datoteku nakon što su svi podaci učitani.

Komentariši