• tekstualne datoteke • binarne datoteke Tekstualne datoteke Tekstualna datoteka se sastoji od niza znakova koji je znakovima za prelazak u novi red (‘\n’)podijeljen u redove. Svi znakovi u ovakvom nizu mogu da se prikažu na ekranu ili štampaju na štampaču. Brojevi se u tekstualni fajlovima čuvaju u obliku teksta (kao niz cifara). Binarne datoteke Sastoje se od niza znakova ciji je sadržaj slika predstavljanja podataka u memoriji računara. Nema konverzije u toku upisa u fajl već se podaci prenose bajt po bajt. Strukturu binarnog fajla definiše sam programer pa ne postoje univerzalni programi u sklopu operativnih sistema koji bi mogli prikazivati sadržaj binarnog fajla. Rad sa datotekama Pri radu sa datotekama postoje sledeće radnje: • otvaranje datoteke • pristup datoteci • isptivanje stanja datoteke • zatvaranje datoteke Otvaranje datoteke FILE *fopen(char *filename, const char *mod);
filename – predstavlja putanju i
ime datoteke koja se otvara, npr. D:\fajl.txt
mod – režim u kome se datoteka
otvara; Otvaranje datoteke Parametar mod može imati sledeće vrijednosti: • “r“ – otvaranje datoteke za čitanje (pozicioniranje na početak datoteke) • “w“ – upis u novu datoteku (ako ne postoji kreira se, ako postoji prebriše se sadržaj) • “a“ – dopisivanje na kraj stare (ako postoji) ili upis u novu datoteku Otvaranje datoteke Za naizmjenično čitanje i upis u datoteku potrebno je prethodnim oznakama dodati znak +, nebitno o kom osnovnom režimu se radi, pa se dobija:
“r+“, “w+“, “a+“
Otvaranje datoteke Prethodno navedeni načini otvaranja datoteke odnosili su se na tekstualne datoteke. Razlika kod otvaranja binarnih datoteka je što se vrijednosti parametra mod dodaje još slovo b pa se dobijaju sledeće vrijednosti: “rb“,“wb“,“ab“, “r+b“, “a+b“, “w+b“ Zatvaranje datoteke Datoteka se zatvara funkcijom fclose čiji je prototip:
int fclose(FILE *dat);
dat – pokazivač koji je pridružen datoteci
koja se zatvara Povratna vrijednost funkcije je 0 ako je zatvaranje uspjelo ili simbolička konstanta EOF ako zatvaranje nije uspjelo Završetak izvrašavanja programa dovodi do automatskog zatvaranja svih otvorenih datoteka. Rad sa tekstualnim datotekama Funkcije za prenos znakova:
int fgetc(FILE *dat);
int getc(FILE *dat);
Ove funkcije čitaju i vraćaju po
jedan znak iz datoteke dat. Ukoliko se dođe do kraja datoteke funkcije vraćaju EOF. Rad sa tekstualnim datotekama Funkcije za prenos znakova:
int fputc(int znak, FILE *dat);
int putc(int znak, FILE *dat);
Ove funkcije upisuju znak u datoteku
dat. Vrijednost funkcija je kod ispisanog znaka, odnosno EOF ako je došlo do greške pri upisu. Rad sa tekstualnim datotekama Čitanje reda iz tekstualne datoteke radi se funkcijom:
char *fgets(char *tekst, int n, FILE *dat);
Ova funkcija čita jedan red teksta (do znaka ‘\n’)
ili najviše n-1 znakova iz datoteke dat i upisuje u niz tekst.
Funkcija dodaje znak ‘\n’ iza pročitanih znakova.
Vrijednost funkcije je tekst (pokazivač) ili NULL u
slučaju greške ili nailaska na kraj datoteke. Rad sa tekstualnim datotekama Upis reda u tekstualnu datoteku radi se funkcijom:
int *fputs(char *tekst, FILE *dat);
Ova funkcija upisuje niz znakova tekst u
tekstualnu datoteku dat.
Funkcija dodaje znak ‘\n’ iza upisanih
znakova.
Vrijednost funkcije je ne-negativan broj
ili EOF u slučaju greške pri upisu. Rad sa tekstualnim datotekama Upis podataka sa konverzijom radi se funkcijom: int fprintf(FILE *dat, const char *format, arg1, arg2, ...);
Ova funkcija je ista kao funkcija printf
samo što kao prvi parametar prima pokazivač na datoteku u koju se upisuje (dat).
Vrijednost funkcije je broj znakova u
rezulutujućem nizu znakova isto kao kod funkcije printf. Rad sa tekstualnim datotekama Čitanje podataka sa konverzijom radi se funkcijom: int fscanf(FILE *dat, const char *format, arg1, arg2, ...);
Ova funkcija je ista kao funkcija scanf
samo što kao prvi parametar prima pokazivač na datoteku u koju se upisuje (dat).
Vrijednost funkcije je broj pročitanih
(konvertovanih) podataka, a ne broj iskorištenih znakova. Binarne datoteke Za rad sa binarnim datotekama,postoje dvije osnovne funkcije:
size_t fread(void *ptr_dest, size_t sizeB,
size_t n_memb, FILE *dat)
size_t fwrite(const void *ptr_dest,
size_t sizeB, size_t n_memb, FILE *dat) Binarne datoteke Funkcija za čitanje iz binarne datoteke:
size_t fread(void *ptr_dest, size_t sizeB,
size_t n_memb, FILE *dat)
*ptr_dest – pokazivač na memorijsku adresu smještanja pročitanog
podatka, sa minimalnom veličinom sizeB*n_memb
sizeB – veličina u bajtovima elementa (bilo koji tip podatka) koji se
čita
n_memb – broj takvih elemenata
*dat – pokazivač na datoteku
size_t - povratna vrijednost funkcije je broj pročitanih elemenata
Binarne datoteke Funkcija za pisanje u binarnu datoteke:
size_t fwrite(const void *ptr_dest, size_t sizeB,
size_t n_memb, FILE *dat)
*ptr_dest – pokazivač na memorijsku adresu elementa koji se
upisuje u fajl
sizeB – veličina u bajtovima elementa (bilo koji tip podatka) koji se
upisuje
n_memb – broj takvih elemenata
*dat – pokazivač na datoteku
size_t - povratna vrijednost funkcije je broj upisanih elemenata
Binarne datoteke Sljedeće funkcije nam omogućavaju direktan pristup, tj. dohvatanje trenutne pozicije u datoteci i pozicioniranje u datoteci:
int fseek(FILE *dat, long pomjeraj, int poz)
long ftell(FILE *fp)
void rewind(FILE *dat)
Binarne datoteke int fseek(FILE *dat, long pomjeraj, int poz)
Ovom funkcijom se pozicionira na mjesto u datoteci dat
čija je udaljenost pomjeraj bajtova od označene poz tačke. Treći parametar poz ukazuje od kog mjesta se mjeri pomjeraj. Moguće tačke pozicije (poz) obilježavaju se sledećim konstantama: SEEK_SET – početak datoteke SEEK_CUR – trenutna pozicija u datoteci SEEK_END - kraj datoteke Binarne datoteke
long ftell(FILE *fp)
Funkcija ftell uzima kao argument pokazivač na
otvorenu datoteku i vraća trenutni položaj unutar datoteke, tj. broj bajtova (znakova) od početka do trenutne pozicije u datoteci.W Binarne datoteke
void rewind(FILE *dat)
Ovom funkcijom se pozicionira na početak
datoteke dat . Datoteke
int feof(File *dat)
Ova funkcija ispituje indikator kraja datoteke za
datoteku dat. Ukoliko je trenutna pozicija na kraju datoteke, povratna vrijednost funkcije je različita od nule (!=0). Ukoliko trenutna pozicija nije na kraju, povratna vrijednost je jednaka nuli (NULL). Primjer 1 Napisati program koji korisniku pruža mogućnost da sa tastature unese svoje ime, prezime i godinu rođenja, a potom ih upisati u tekstualni fajl podaci.txt. Primjer 2 Napisati funkciju koja kao parametre prima dva pokazivača na fajlove i prepisuje sadržaj prvog fajla u drugi fajl.
Na proizvoljnoj lokaciji na računaru
napraviti tekstualni fajl i upisati prozvoljan sadržaj, a zatim ga kopirati korištenjem prethodne funkcije. Primjer 3 Napisati program koji omogucava korisniku da sa tastature unese proizovljan broj studenata (ime, prezime i broj indeksa), a zatim ih upisati u tekstualni fajl tako da se u prvom redu nalazi broj upisanih studenata, a potom slijede podaci o studentima. Nakon unosa studenata, napisati novi program koji će upisane studente iz tekstualnog fajla ispisati na ekran. Primjer 4 Koristeći tekstualni fajl iz prethodnog primjera, napisati program koji korisniku omogućava unos još jednog studenta i upisati ga u fajl na prvo mjesto (nakon broj studenata). Primjer 5 Napisati program koji omogućava korisniku unos proizvoljnog broja studenata (ime i prezime, broj indeksa, godina studiranja i smijer) koji se čuvaju u binarnoj datoteci artikli.BIN. Broj unijetih studenata uvijek pamtiti na početku datoteke.
Napisati funkciju koja sortira studente po godini
studiranja u opadajućem redoslijedu. U datoteci takođe treba da bude sortiran poredak. Nakon poziva funkcije, na ekran ispisati sadržaj datoteke. Primjer 6 Napisati program koji omogućava korisniku evidenciju artikala (šifra artikla, ime proizvođača, cijena, količina) u prodavnici koji se čuvaju u binarnoj datoteci artikli.txt. Broj artikala pamtiti na kraju datoteke.
Napisati funkciju koja za prosleđeni broj artikla,
umanjuje njegovu količinu i zatim ažurira sadržaj datoteke.
Napisati funkciju koja izbacuje sve artikle kod kojih je
količina jednaka nuli. Voditi računa o broju artikala. POKAZATI KORIŠTENJE ZAGLAVLJA Pitanja?