/* int fseek(FILE* stream, long offset, int whence) je funkcija za podesavanje pozicije u fajlu; nova pozicija se dobija tako sto se offset velicina doda ne vrednost navedenu whence argumentom; povratna vrednost funkcije je 0 ako je sve u redu, odnosno -1 ako je doslo do neke greske; argumenti funkcije su joj redom: stream - fajl u okviru koga se vrsi podesavanje offset - vrednost u bajtovima - moze biti i pozitivna i negativna velicina whence - parametar koji naznacava u odnosu na sta se vrsi podesavanje; moze imati vrednosti: SEEK_SET - podesavanje u odnosu na pocetak fajla SEEK_CUR - podesavanje u odnosu na tekucu poziciju u fajlu SEEK_END - podesavanje u odnosu na kraj fajla */ /* long ftell(FILE* stream) je funkcija koja vraca tekucu poziciju u fajlu povratna vrednost je ili tekuca pozicija ili -1 za slucaj greske */ /* void rewind(FILE* stream) je funkcija koja postavlja poziciju u fajlu na 0 tj. na njegov pocetak */ #include #include int main(void){ FILE* ulaz; /* datoteka sadrzi slova alfabeta abcdefghijklmnopqrstuvwxyz */ ulaz=fopen("slova.txt", "r"); if(ulaz==NULL){ fprintf(stderr,"Problem sa otvaranjem datoteke slova.txt!\n"); exit(EXIT_FAILURE); } /* nakon otvaranja datoteke za citanje, pocetna pozicija je postavljena na 0 */ /* 1 char podatak = 1 bajt */ char c; c=fgetc(ulaz); /* procitano je slovo sa pozicije 0 (a), i pozicija u fajlu je postavljena na 1*/ putchar(c); /* ispisano je slovo a */ putchar('\n'); c=fgetc(ulaz); /* procitano je slovo sa pozicije 1 (b) i pozicija u fajlu je postavljena na 2 */ putchar(c); /* ispisano je slovo b */ putchar('\n'); printf("Tekuca pozicija: %ld\n", ftell(ulaz)); fseek(ulaz,5,SEEK_CUR); /* pozicija u fajlu se pomera za +5 mesta (bajtova) u odnosu na tekucu poziciju tekuca pozicija nam je bila 2, pa je sada 2+5=7 */ c=fgetc(ulaz); /* citamo karakter sa pozicije 7, i pozicija se uvecava za 1-- sada je 8 */ putchar(c); putchar('\n'); fseek(ulaz,10, SEEK_CUR); /* pozicija u fajlu se pomera za +10 mesta (bajtova) u odnosu na tekucu poziciju tekuca pozicija nam ej bila 8, pa je sada 8+10=18 */ c=fgetc(ulaz); /* citamo karakter sa pozicije 18 i pozicija se uvecava za 1 -- sada je 19 */ putchar(c); putchar('\n'); fseek(ulaz, -4, SEEK_CUR); /* pozicija u fajlu se pomera za -4 mesta (bajta) u odnosu na tekucu poziciju tekuca pozicija nam je 19, pa je sada 19-4=15 */ c=fgetc(ulaz); /* citamo karakter sa pozicije 15, i pozicija se uvecava za 1 -- sada je 16 */ putchar(c); putchar('\n'); printf("Tekuca pozicija: %ld\n", ftell(ulaz)); /* tekuca pozicija u fajlu se moze dobiti i sa fseek(ulaz,0,SEEK_CUR) */ fseek(ulaz,4, SEEK_SET); /* pozicija u fajlu se pomera za 4 mesta(bajta) u odnosu na pocetak fajla -- poziciju 0 tekuca pozicija nam je 0+4=4 */ c=fgetc(ulaz); /* citamo karakter sa pozicije 4 i poziciju uvecavamo za 1-- sada je to 5 */ putchar(c); putchar('\n'); /* za radoznale */ /* pozivamo funkciju fseek, pistupamo 126tom bajtu pre pocetka fajla, povratna vrednost je -1, sto zanci da ovaj poziv nije korektan i nema nikakvih modifikacija tekuce pozicije => NE SMEMO PRISTUPATI OPSEGU PRE POCETKA FAJLA */ printf("Povratna vrednost funkvije fseek: %d\n", fseek(ulaz,-126,SEEK_SET)); /* ovaj poziv fije ne prolazi, tekuca pozicija ostaje 5 */ c=fgetc(ulaz); /* citamo karakter sa pozicije 5 i pozicija se uvecava za 1 */ putchar(c); putchar('\n'); /* pozicioniramo se na kraj fajla */ /* broj slova u datoteci je 26, svako slovo jedan bajt - 26 bajtova; racuna se i EOF, znaci 27 bajtova.. */ fseek(ulaz,0,SEEK_END); printf("Pozicioniranje na kraj: %ld\n", ftell(ulaz)); /* videti ispis komande ls -l za tekuci direktorijum : velicina fajla slova.txt je 27 bajtova */ fseek(ulaz, -3, SEEK_END); /* modifikujemo tekucu poziciju relativno u odnosu na kraj fajla: pozicija je 27, idemo za 3 pozicije unazad, pa je nova pozicija 27-3=24 */ printf("Tekuca pozicija: %ld\n", ftell(ulaz)); c=fgetc(ulaz); /* citamo karakter sa pozicije 24 i pozicija se uvecava za 1 -- sada je 25 */ putchar(c); putchar('\n'); printf("Tekuca pozicija: %ld\n", ftell(ulaz)); /* za radoznale: SMEMO DA PRISTUPAMO OPSEGU NAKON KRAJA FAJLA */ printf("Povratna vrednost funkcije fseek: %d\n",fseek(ulaz,10,SEEK_END)); c=fgetc(ulaz); putchar(c); putchar('\n'); /* postavljamo poziciju na pocetak fajla */ rewind(ulaz); printf("Tekuca pozicija: %ld\n", ftell(ulaz)); /* isto smo mogli postici i sa: fseek(ulaz,0,SEEK_SET) */ /*zatvaramo datoteku za citanje */ fclose(ulaz); /*zavrsavamo sa programom */ exit(EXIT_SUCCESS); }