Позиционирања унутар датотеке¶
Навели смо да функција fopen
враћа показивач на датотеку, односно да се позиционира на њен почетак. Датотеке у језику С
су секвенцијалне, а то значи да се подацима приступа по редоследу смештања у датотеку. Осим приступа подацима на почетку датотеке, дозвољено је да се подацима приступи директно унутар датотеке. То представља бржи начин приступа подацима унутар датотеке. Предност директног приступа подацима је та што време приступа неком податку у датотеци не зависи од места на ком се он налази. Програмски језик C
подржава директан приступ уз једно ограничење:
да бисмо директно приступили неком податку, потребно је да се зна његово одстојање у бајтовима од почетка фајла. Показивач на датотеку дефинисаћемо као
FILE *datoteka
.
fseek¶
Функција fseek
користи се за позиционирање показивача на неко место унутар фајла.
Њен облик је:
int fseek(datoteka, pomeraj, odakle)
Функција fseek
омогућава позиционирање у датотеци datoteka
на место које се за pomeraj
разликује од позиције дефинисане са odakle
.
Вредност odakle
може бити:
– SEEK_CUR
: означава тренутну позицију у датотеци,
– SEEK_ЕND
: означава крај фајла,
– SEEK_SET
: означава почетак фајла.
Повратна вредност
Уколико се функција обави успешно, повратна вредност је једнака 0. У супротном је повратна вредност различита од нуле.
Битно је напоменути да функција fseek
не чита нити уписује податке, она само позиционира показивач!
ftell¶
Функција ftell
даје тренутну вредност показивача у односу на почетак фајла.
Њен облик је:
ftell(datoteka);
Резултат ове функције представља број бајтова од почетка фајла до тренутне позиције.
rewind¶
Функција rewind враћа позицију показивача на почетак фајла. Њен облик је:
rewind(datoteka).
У следећем примеру датотека има 41 знак и њен садржај гласи: Ovo je primer za funkcije ftell i rewind.
Пример за функције ftell i rewind:
#include<stdio.h>
int main(void)
{
FILE *ulaz;
int i,broj,n;
ulaz=fopen("datoteka.txt","r");
if(ulaz==NULL)
{
printf("Greska!");
return 1;
}
//pokazivac se pozicionira na dva mesta do kraja fajla
fseek(ulaz,-2,SEEK_END);
//ftell vraca broj bajtova od pocetka fajla do trenutne pozicije
int p=ftell(ulaz); // vraca 39 (41-2)
printf("%d\n",p);
//rewind vraca pokazivac na pocetak fajla
rewind(ulaz);
p=ftell(ulaz);// vraca 0 (pocetak fajla)
printf("%d\n",p);
//pokazivac se pozicionira na sedam mesta od pocetka fajla
fseek(ulaz,7,SEEK_SET);
p=ftell(ulaz); //vraca 7
printf("%d\n",p);
//pokazivac se pozicionira na tri mesta od trenutne pozicije u fajlu
fseek(ulaz,3,SEEK_CUR);
p=ftell(ulaz); //vraca 10 (7+3)
printf("%d\n",p);
fclose (ulaz);
return 0;
}
Датотека datoteka.txt
Ovo je primer za funkcije ftell i rewind.
Резултат извршавања програма:
39
0
7
10