You are on page 1of 41

Datoteke

• ulaz/izlaz podataka - omogućava


komunikaciju programa
sa spoljnim svetom
 unos podataka i odlaganje rezultata
 U/I uredaji
 datoteke
• datoteke imaju poseban marker
kraja – EOF (ctrl-D unix, ctrl-Z dos)
Datoteke

prema načinu smeštanja podataka:

• tekstualne
 niz znakova podeljenih u redove (\n)

• binarne
 niz brojeva čiji je sadržaj verna slika
sadržaja podataka u memoriji,
(ne mogu se štampati)
Datoteke

prema organizaciji datoteke:

• sekvencijalne

• relativne

• indeksne
Datoteke

• u C-u postoje samo sekvencijalne


datoteke koje su po strukturi niz
bajtova bez podele na zapise
(koristi se i termin tok)

• postoji modifikovani oblik direktnog


pristupa i svodi se na mogućnost
pozicioniranja na neki bajt u okviru
datoteke
Datoteke

radnje nad datotekom

• otvaranje
 uspostavljanje veze sa fizičkom
datotekom
• pristup datoteci
 prenos podataka u/iz datoteke
(sa ili bez konverzije)
Datoteke

radnje nad datotekom

• ispitivanje stanja datoteke


 dobijanje informacija
o eventualnim greškama
nastalim u toku pristupa
• zatvaranje datoteke
 raskidanje veze sa fizičkom datotekom
Otvaranje datoteke

prototip funkcije fopen za otvaranje

FILE *fopen (const char *imedat, const char *rezim);


• imedat - znakovni niz koji predstavlja
ime datoteke (može i dev i dir info)
• režim - znakovni niz oznacava
osnovni nacin korišcenja datoteke
 "r"- citanje iz postojece
 "w"- upisivanje u novu
 "wx"- upisivanje u novu, greška ako već postoji
 "a"- dopisivanje na kraj postojece
Otvaranje datoteke

• naizmenično čitanje i pisanje


se omogućava dodavanjem + na
osnovni režim ("r+", "w+", "w+x", "a+")

• default - rad sa tekstualnim datotekama

• za rad sa binarnim datotekama dodati b


("rb", "wb", "wbx", "ab", "r+b", "w+b",
"w+bx", "a+b")
• može i ovako: ("rb+", "wb+", "wb+x", "ab+")
Otvaranje datoteke

vrednost funkcije fopen

• pokazivač na strukturu podataka


pridruženu datoteci ili
NULL ako je greška

• dodeljuje se pokazivačkoj promenljivoj


koja se zatim koristi pri pristupu

• korisnik ne sme da je menja


Otvaranje datoteke

tipične greške

• pogrešno ime datoteke


• nepostojanje datoteke
pri otvaranju u režimu "r"
• ako "w", a datoteka postoji,
bice uništena bez opomene

greska = (podaci = fopen ("dat.txt", "r")) == NULL;


Zatvaranje datoteke

zatvaranje datoteke

int fclose (FILE *dat);

• dat - pokazivač pridružen datoteci koja se zatvara

vrednost funkcije
 uspešno - 0
 greška - EOF
Zatvaranje datoteke

• kada se završi program,


sve otvorene datoteke se zatvaraju

greška = fclose (podaci) == EOF;


Tekstualne datoteke –
prenos znakova

čitanje jednog znaka bez konverzije

int fgetc (FILE *dat); iz datoteke


int getc (FILE *dat); iz datoteke
int getchar (void); sa glavnog ulaza

• fgetc - prava funkcija


• getc - makro (može da izračunava više
puta), efikasnije, iako logički isto
Tekstualne datoteke –
prenos znakova

vrednost funkcije:

• kod pročitanog znaka


• EOF ako se dođe do kraja datoteke
ili greška

greska = (znak = fgetc (podaci)) == EOF;


Tekstualne datoteke –
prenos znakova

ispisivanje jednog znaka (zn)

int fputc (int zn, FILE *dat); u datoteku


int putc (int zn, FILE *dat); u datoteku
int putchar (int zn); na glavni izlaz
Tekstualne datoteke –
prenos znakova

vrednost funkcije

• kod ispisanog znaka


• EOF ako dođe do greške

greska = fputc ('A', podaci) == EOF;


Tekstualne datoteke –
prenos znakova

čitanje jedne linije teksta u znakovni niz


tekst

char *fgets (char *tekst, int n, FILE *dat);


iz datoteke
char *gets (char *tekst);
sa glavnog ulaza
char *gets_s (char *tekst, int n);
sa glavnog ulaza
• maksimalan broj znakova kod fgets i gets_s
(preporučena u C11) je n-1, iza se dodaje ‘/0’
Tekstualne datoteke –
prenos znakova

vrednost funkcije

• tekst (adresa!)
• NULL ako se dođe do kraja
datoteke ili greška

greska = fgets (recenica, 55, podaci) == NULL;


Tekstualne datoteke –
prenos znakova

ispisivanje znakovnog niza tekst


kao jedne liniju teksta

int fputs (const char *tekst, FILE *dat);


u datoteku
int puts (const char *tekst);
na glavni izlaz
Tekstualne datoteke –
prenos znakova

vrednost funkcije

• nenegativan broj
• EOF ako dođe do greške

greska = fputs ("Poruka", podaci) == EOF;


Prenos podataka
sa konverzijom
ispisivanje podataka arg1, arg2, ...
uz konverziju zadatu znakovnim nizom format

int fprintf(FILE *dat, const char *format, arg1, arg2, ...);


u datoteku
int printf(const char *format, arg1, arg2, ...);
na glavni izlaz
int sprintf(char *niz, const char *format, arg1, arg2, ...);
u znakovni niz
int snprintf(char *niz, int n, const char *format, arg1, arg2,
...)
u znakovni niz, max n znakova, greška i ako ne konvertuje sve
• sprintf - interna konverzija u memoriji
Neobavezne funkcije (C11)

ispisivanje podataka arg1, arg2, ...


uz konverziju zadatu znakovnim nizom format

int fprintf_s(FILE *dat, const char *format, arg1, arg2, ...);


u datoteku
int printf_s(const char *format, arg1, arg2, ...);
na glavni izlaz
int sprintf_s(char *niz, const char *format, arg1, arg2, ...);
u znakovni niz
int snprintf_s(char *niz, int n, const char *format, arg1, arg2, ...)
u znakovni niz, max n znakova, greška i ako ne konvertuje sve

• Vrši se provera da li su različiti od NULL dat,


niz, format, arg1, arg2, ...
Prenos podataka
sa konverzijom

vrednost funkcija

• broj konvertovanih znakova


• negativna ako je došlo do greške

greska =
fprintf (podaci, "Br. studenata je %d\n", ns) < 0;
Prenos podataka
sa konverzijom

čitanje podataka arg1, arg2, ...


uz konverziju zadatu znakovnim nizom format

int fscanf (FILE *dat, const char *format, arg1,


arg2, ...); iz datoteke
int scanf (const char *format, arg1, arg2, ...);
sa glavnog ulaza
int sscanf (char *niz, const char *format, arg1,
arg2, ...); iz znakovnog niza

• sscanf - interna konverzija u memoriji


Prenos podataka
sa konverzijom

vrednost funkcija

• broj konvertovanih podataka


(ne znakova!)
• EOF ako je došlo do
kraja datoteke ili greške

greska = fscanf (podaci, "%d", &ns) == EOF;


Neobavezne funkcije (C11)

Bezbedno čitanje podataka uz konverziju za


svaki argi sa konverzijom %s ili %c naredni
argi+1 je dužina niza na koji argi pokazuje
int fscanf_s (FILE *dat, const char *format, arg1,
arg2, ...); iz datoteke
int scanf_s (const char *format, arg1, arg2, ...);
sa glavnog ulaza
int sscanf_s (char *niz, const char *format, arg1,
arg2, ...); iz znakovnog niza
Primer:
int i; char c; s[30];
scanf_s(“%i%c%s“ &i, &c, 1, s, 30);
Rad sa
binarnim datotekama

čitanje iz datoteke dat


najviše br objekata veličine vel
u memoriju od adrese niz

int fread (void *niz, int vel, int br, FILE *dat);
Rad sa
binarnim datotekama

• čitanje počinje od tekuće pozicije

• programer mora da vodi računa


o logičkoj strukturi datoteke
(kako je upisana)

• vrednost funkcije - broj pročitanih objekata

n = fread (vektor, sizeof(int), n_max, podaci);


Rad sa
binarnim datotekama

ispisivanje u datoteku dat


br objekata veličine vel
u memoriju od adrese niz

int fwrite (const void *niz, int vel, int br,


FILE *dat);
Rad sa
binarnim datotekama

• pisanje počinje na poziciji gde je


prethodni pistup završen

• ako trenutna pozicija nije na kraju datoteke,


prepisuje se preko starih podataka

• ako do kraja nema mesta, datoteka se proširuje

• vrednost funkcije - broj prenetih objekata


(ako je greška - manji je od br)

greska = fwrite (vektor, sizeof(int), n, podaci) < n;


Pozicioniranje unutar datoteke
(direktan pristup)

pozicioniranje na mesto u datoteci


čija je udaljenost
pomeraj bajtova od reper

int fseek(FILE *dat,long pomeraj,int reper);


Pozicioniranje unutar datoteke
(direktan pristup)
• moguće reperne tacke
 SEEK_SET - početak datoteke
 SEEK_CUR - trenutna pozicija
 SEEK_END - kraj datoteke
• naredni pristup počinje
od specificirane pozicije
• ako ne postoji datoteka se proširuje
• fseek mora da se pozove nakon
nekoliko čitanja, a pre upisa ili
nakon nekoliko upisa, a pre čitanja
Pozicioniranje unutar datoteke
(direktan pristup)

• pomeraj za tekstualnu datoteku


 nula
 vrednost funkcije ftell
(reper mora SEEK_SET)

• greška - ako je vrednost funkcije


različita od nule

greska = fseek (podaci, 10000L, SEEK_SET) != 0;


Pozicioniranje unutar datoteke
(direktan pristup)

nalaženje trenutne pozicije u datoteci

long ftell (FILE *dat);


Pozicioniranje unutar datoteke
(direktan pristup)

• vrednost funkcije
 trenutna pozicija u bajtovima
od početka datoteke
 -1L ako je greška

greska = (mesto = ftell(podaci)) == -1L;


Pozicioniranje unutar datoteke
(direktan pristup)

pozicioniranje na početak datoteke

void rewind (FILE *dat);

• ova funkcija nema vrednost


Signalizacija grešaka

• svakoj otvorenoj datoteci


pridružena dva logička indikatora

 za kraj datoteke
 za grešku

• većina funkcija iz <stdio.h>


postavlja i ova dva indikatora
kao bočni efekat
Signalizacija grešaka

brisanje indikatora greške


i kraja datoteke

void clearerr (FILE *dat);

• ova funkcija nema vrednost


Signalizacija grešaka

ispitivanje indikatora kraja datoteke

int feof (FILE *dat);

• vrednost različita od nule,


ako je indikator kraja postavljen
Signalizacija grešaka

ispitivanje indikatora greške

int ferror (FILE *dat);

• vrednost različita od nule,


ako je indikator greške postavljen

• celobrojni izraz errno daje šifru greške


sa dodatnom informacijom
nalazi se u biblioteci <errno.h>
Signalizacija grešaka
ispitivanje indikatora greške

void perror (const char *por);

• ispisuje na izlazu za poruke stderr nisku por,


zatim : i tekstualno tumačenje šifre greške
(zavisi od prevodioca)

const char *strerror (int sifra);

• vraća pokazivač na tekstualno tumačenje greške


sa zadatom šifrom.

You might also like