9 UPRAVLJANJE TOKOVIMA DATOTEKE Sadraj pojam toka vrste

  • Slides: 31
Download presentation
9 UPRAVLJANJE TOKOVIMA (DATOTEKE)

9 UPRAVLJANJE TOKOVIMA (DATOTEKE)

Sadržaj • • pojam toka vrste tokova u C-u definisanje datotečne promenljive otvaranje datoteke

Sadržaj • • pojam toka vrste tokova u C-u definisanje datotečne promenljive otvaranje datoteke zatvaranje datoteke korišćenje tekstuelnih datoteka korišćenje binarnih datoteka 2

 • u modernim programskim jezicima svi izvori i odredišta podataka koji nisu deo

• u modernim programskim jezicima svi izvori i odredišta podataka koji nisu deo programa tretiraju se na isti način i nazivaju tokovima (engl. stream) • datoteka na disku, tastatura i ekran su tokovi; datoteka je ulazno-izlazni tok, tastatura je ulazni, a ekran izlazni tok • osnovna osobina toka jeste to što on nije deo programa • programski jezici tretiraju tokove kao sekvence bajtova sa semantikom ili bez nje • u nastavku ćemo razmatrati datoteke kao najopštiji slučaj 3

Vrste datoteka u C-u • programski jezik C omogućava korišćenje dve vrste datoteka: –

Vrste datoteka u C-u • programski jezik C omogućava korišćenje dve vrste datoteka: – tekstuelne datoteke (tzv. tekst-fajlovi) gde svaki element datoteke ima unapred zadatu semantiku i to semantiku znaka (tip char) – binarne datoteke u kojima se datoteka tretira kao sekvenca bajtova, a semantika se zadaje u programu 4

 • rukovanje datotekama obuhvata četiri grupe aktivnosti: – definisanje datotečne promenljive – otvaranje

• rukovanje datotekama obuhvata četiri grupe aktivnosti: – definisanje datotečne promenljive – otvaranje datoteke – zatvaranje datoteke – korišćenje datoteke • otvaranje, zatvaranje i korišćenje datoteka obavlja se pomoću standardnih funkcija koje se nalaze u zaglavlju <stdio. h> 5

Definisanje datotečne promenljive • datotečna promenljiva je sredstvo za rukovanje tokovima; to je obična

Definisanje datotečne promenljive • datotečna promenljiva je sredstvo za rukovanje tokovima; to je obična promenljiva koja se posebnom funkcijom vezuje za datoteku datotečna promenljiva • definiše se sa FILE* dat; • gde je FILE* poseban tip definisan pomoću typedef u zaglavlju <stdio. h> • primer: • FILE* my. File; 6

Otvaranje datoteke • otvaranje datoteke je aktivnost kojom se – zadaje konkretna datoteka, preko

Otvaranje datoteke • otvaranje datoteke je aktivnost kojom se – zadaje konkretna datoteka, preko putanje – određuje interpretacija sadržaja (tekst-fajl ili binarna datoteka) – zadaje način pristupa podacima (samo čitanje, samo upis ili i čitanje i upis). • funkcija za otvaranje datoteke ima prototip; FILE* fopen(char* putanja, char* režim); gde su putanja i režim stringovi. 7

 • putanja je string koji određuje apsolutnu ili relativnu putanju (tj. način identifikacije)

• putanja je string koji određuje apsolutnu ili relativnu putanju (tj. način identifikacije) datoteke u datom fajl-sistemu • režim je kratak, kodirani string koji zadaje vrstu datoteke i način njene upotrebe; ima 12 varijanata 8

tekst-fajlovi r - datoteka mora postojati; koristi se kao read-only w - ako datoteka

tekst-fajlovi r - datoteka mora postojati; koristi se kao read-only w - ako datoteka ne postoji biće napravljena; ako postoji biće ispražnjena; koristi se kao write-only a - ako datoteka ne postoji biće napravljena; ako postoji, novi elementi biće dodavani na kraju; koristi se kao write-only r+ isto kao gore, samo što je u sva tri slučaja dozvoljeno w+ i čitanje i upis (read-write) a+ 9

binarne datoteke rb wb ab rb+ ili r+b wb+ ili w+b ab+ ili a+b

binarne datoteke rb wb ab rb+ ili r+b wb+ ili w+b ab+ ili a+b sve isto kao kod tekst-fajlova, ali se odnosi na binarne datoteke 10

 • funkcija fopen kao vrednost vraća tip FILE*, tj. pokazivač, koji se dodeljuje

• funkcija fopen kao vrednost vraća tip FILE*, tj. pokazivač, koji se dodeljuje datotečnoj promenljivoj • ako otvaranje iz bilo kojeg razloga nije uspelo, funkcija fopen vraća vrednost NULL • po pravilu, pri otvaranju se uvek proverava uspešnost: if((my. File=fopen("c: \mydir\fajl. txt", "r"))==NULL) //greska //ako se prodje gornja provera sve je u redu 11

važno! • Treba zapaziti da neka datoteka na disku sama po sebi nije ni

važno! • Treba zapaziti da neka datoteka na disku sama po sebi nije ni tekstuelna ni binarna; ona je prosto niz bajtova • tekstuelna odnosno binarna datoteka je samo način interpretacije bajtova • shodno tome ista datoteka može se otvoriti kao tekstuelna ili kao binarna 12

Zatvaranje datoteke • operacijom zatvaranja, datoteka se prevodi u završno stanje (prazne se baferi

Zatvaranje datoteke • operacijom zatvaranja, datoteka se prevodi u završno stanje (prazne se baferi operativnog sistema i datotečna promenljiva "odvezuje" od datoteke) int fclose(FILE* dat); • vraćena vrednost je 0 ako je zatvaranje uspešno; ako nije, vraćena vrednost je različita od 0 i jednaka simboličkoj konstanti EOF. fclose(my. File); 13

 • dok je otvorena, datoteka je podložna otkazima; zato se treba pridržavati principa

• dok je otvorena, datoteka je podložna otkazima; zato se treba pridržavati principa datoteka se otvara tada kada je potrebna, a zatvara kada više ne treba! • drugim rečima, loša je praksa otvoriti sve datoteke na početku programa, a zatvoriti ih na kraju 14

Korišćenje datoteka • osnovna aktivnost vezana za korišćenje datoteka jeste upis podataka u datoteku

Korišćenje datoteka • osnovna aktivnost vezana za korišćenje datoteka jeste upis podataka u datoteku i čitanje podataka iz nje • ove dve aktivnosti nose zajednički naziv prenos podataka 15

Baferovani prenos disk bafer program • čitanje: isto, u obrnutom smeru • fclose prazni

Baferovani prenos disk bafer program • čitanje: isto, u obrnutom smeru • fclose prazni bafer 16

Navigacija • prenos podataka bazira se na mehanizmu navigacije: u svakom trenutku, definisan je

Navigacija • prenos podataka bazira se na mehanizmu navigacije: u svakom trenutku, definisan je tzv. tekući bajt; obe vrste prenosa (čitanje i upis) obavljaju se implicitno na mestu tekućeg bajta • početni položaj markera tekućeg bajta postavlja fopen • posle svakog čitanja ili upisa elementa, marker tekućeg bajta automatski se pomera na mesto iza poslednjeg učitanog odn. upisanog bajta 17

Prenos podataka kod tekstuelnih datoteka • tekstuelne datoteke (tekst-fajlovi) jesu tokovi čiji su elementi

Prenos podataka kod tekstuelnih datoteka • tekstuelne datoteke (tekst-fajlovi) jesu tokovi čiji su elementi znakovi • postoje dva načina prenosa podataka: – prenos bez konverzije (formatiranja) gde se prenose pojedinačni znakovi odnosno stringovi – prenos sa konverzijom (formatiranjem) gde se izlazne vrednosti konvertuju u znakove u skladu sa konverzionim specifikacijama (kao kod scanf i printf) 18

prenos bez konverzije • int fgetc(FILE* dat); – vraća sledeći znak iz datoteke •

prenos bez konverzije • int fgetc(FILE* dat); – vraća sledeći znak iz datoteke • int getc(FILE* dat); – isto što i fgetc, ali je ovo makrodirektiva • int getchar(); – isto što i fgetc; podrazumeva se da se čita sa standardnog ulaza (tastatura) • Za sve tri varijante: ako u datoteci nema više znakova ili ako čitanje nije uspelo vraća se EOF 19

 • int fputc(int zn, FILE* dat); – upisuje znak zn u datoteku dat

• int fputc(int zn, FILE* dat); – upisuje znak zn u datoteku dat • int putc(int zn, FILE* dat); – isto što i fputc, ali je ovo makrodirektiva • int putchar(); – isto što i fputc; podrazumeva se da se upisuje na standardni izlaz (ekran) • Za sve tri varijante: vraća se vrednost upisanog znaka ili EOF ako upis nije uspeo 20

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

• char* fgets(char* tekst, int n, FILE* dat); char* gets(char *tekst); – fgets učitava liniju teksta u string tekst; čitanje se prekida ako se učita n-1 znak ili ako se naiđe na n; gets očitava liniju teksta sa standardnog ulaza; obe funkcije vraćaju adresu učitanog stringa odnosno NULL ako je kraj datoteke ili greška • int fputs(const char* tekst, FILE* dat); int puts(const char* tekst); – obe funkcije upisuju string tekst (bez znaka ) u datoteku dat (fputs) ili na standardni izlaz (puts); vraćaju nenultu vrednost u slučaju uspeha odnosno EOF ako je došlo do greške 21

prenos sa konverzijom • za prenos se koriste funkcije fscanf(FILE* dat, . . fprintf(FILE*

prenos sa konverzijom • za prenos se koriste funkcije fscanf(FILE* dat, . . fprintf(FILE* dat, . . koje su iste kao i scanf odnosno printf; jedina razlika je u tome što se prenos vrši iz tekst-fajla dat ili u njega (kod scanf i printf podrazumevaju se tastatura odnosno ekran) 22

datotečne konstante • C poseduje tri datotečne konstante (tipa FILE*) koje predstavljaju tekst- fajlove:

datotečne konstante • C poseduje tri datotečne konstante (tipa FILE*) koje predstavljaju tekst- fajlove: – stdin: standardni ulazni uređaj, tj. tastatura; može se promeniti redirekcijom ulaza – stdout: standardni izlazni uređaj, tj. ekran; može se promeniti redirekcijom izlaza – stderr: ekran; ne može se promeniti • na primer, scanf(. . . ) i fscanf(stdin, . . . ) je isto, kao i printf(. . . ) i fprintf(stdout, . . . ) 23

Prenos podataka kod binarnih datoteka element adresa bafera veličina elementa blok broj elemenata po

Prenos podataka kod binarnih datoteka element adresa bafera veličina elementa blok broj elemenata po bloku datoteka int fread(void* bafer, int vel, int br, FILE* dat); int fwrite(void* bafer, int vel, int br, FILE* dat); 24

 • fread i fwrite vrše upis-čitanje na poziciji tekućeg bajta • fread se

• fread i fwrite vrše upis-čitanje na poziciji tekućeg bajta • fread se može izvršiti samo ako je marker tekućeg bajta unutar datoteke • ako je tekući bajt unutar datoteke, fwrite upisuje novi sadržaj preko starog; ako je tekući bajt na kraju datoteke, novi sadržaj se dodaje 25

 • posle svake primene fread ili fwrite, marker tekućeg bajta pomera se iza

• posle svake primene fread ili fwrite, marker tekućeg bajta pomera se iza poslednjeg bajta kojem je pristupljeno (tj. na sledeći element) tekući bajt element blok 26

primer • primer: u datoteci Spisak. dat nalaze se podaci uređeni u slogove tipa

primer • primer: u datoteci Spisak. dat nalaze se podaci uređeni u slogove tipa typedef struct { char prezime[20]; char ime[15]; } Osoba; 27

 • sledeći segment služi za prikaz datoteke na ekranu: FILE* f. Spisak; Osoba

• sledeći segment služi za prikaz datoteke na ekranu: FILE* f. Spisak; Osoba pers; . . . f. Spisak = fopen("Spisak. dat", "rb"); while(fread(&pers, sizeof(Osoba), 1, f. Spisak)>0) printf("%s %sn", pers. prezime, pers. ime); fclose(f. Spisak); 28

 • Marker tekućeg bajta može menjati poziciju bez menjanja sadržaja datoteke int fseek(FILE

• Marker tekućeg bajta može menjati poziciju bez menjanja sadržaja datoteke int fseek(FILE *dat, long pomeraj, int reper) • nova pozicija zadaje se relativno, kao pomeraj u odnosu na bazu (reper) • za reper postoje tri simboličke konstante: SEEK_SET (početak datoteke), SEEK_END (kraj datoteke), SEEK_CUR (trenutni tekući) SEEK_CUR SEEK_SET SEEK_END 29

 • vrednost pomeraja zadaje se u bajtovima (za tekst fajlove pomeraj mora biti

• vrednost pomeraja zadaje se u bajtovima (za tekst fajlove pomeraj mora biti 0) • funkcija fseek vraća 0 ako je uspela, a vrednost koja nije 0 u slučaju neuspeha • funkcija long ftell(FILE* dat) vraća poziciju tekućeg bajta u odnosu na početak datoteke • funkcija void rewind(FILE* dat) vraća marker tekućeg bajta na početak datoteke 30

Rezime • pojam toka: C jednako tretira sve izvore i odredišta podataka • vrste

Rezime • pojam toka: C jednako tretira sve izvore i odredišta podataka • vrste datoteka u C-u: tekstuelne i binarne • definisanje datotečne promenljive: datotečna promenljiva služi za rukovanje datotekom iz programa • otvaranje datoteke: datoteka se otvara kada je potrebna • zatvaranje datoteke: zatvara se čim više nije potrebna • korišćenje tekstuelnih datoteka: prenos bez formatiranja i sa formatiranjem • korišćenje binarnih datoteka: fread i fwrite 31