9 UPRAVLJANJE TOKOVIMA DATOTEKE Sadraj pojam toka vrste
- Slides: 31
9 UPRAVLJANJE TOKOVIMA (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 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: – 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 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 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 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) 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 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 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 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 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 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 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 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 bafer 16
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 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 • 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 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 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* 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: – 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 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 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 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 typedef struct { char prezime[20]; char ime[15]; } Osoba; 27
• 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 *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 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 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
- Izvestaj o novcanim tokovima
- Izvestaj o novcanim tokovima
- Afilijativnost
- Pojam i vrste kredita
- Vrste motiva
- Pojam i vrste kredita
- Pojam i vrste poreza
- Rashodi definicija
- Pojam i vrste motiva
- Pojam i vrste troškova
- Programske datoteke
- Komprimiranje datoteke
- Znakovne datoteke
- Datoteke python
- Kako se naziva program za rad s datotekama i mapama
- Znakovne datoteke
- Znakovna datoteka
- Mape i datoteke ppt
- Dijagram tijeka simboli
- Strukturna sistemska analiza
- Dijagram toka zadaci i rješenja
- Dijagram kruznog toka
- Algoritam i dijagram tijeka 5 razred
- Toka
- Dijagram kruznog toka
- Dijagram toka primjeri
- Algoritmi primjeri
- Salchak toka
- Dijagram toka procesa
- Pseudokok
- Dijagram kruznog toka
- Dijagram kruznog toka