You are on page 1of 17

OSNOVI PROGRAMIRANJA

( IX )
DATOTEKE

mr Dražen Brđanin
Elektrotehnički fakultet Banja Luka
2007.
9.1. Definicija datoteke
FAJLOVI?

Datoteke (fajlovi)
Datoteka (eng. file) je kolekcija podataka smještena u nekoj sekundardnoj
memoriji (disk, disketa, ...)
Organizacija datoteka s obzirom na način pristupa podacima:
datoteke sa sekvencijalnim pristupom
datoteke sa direktnim pristupom
Prog. jezik C tretira komunikaciju sa perifernim uređajima (tastatura, displej,
disk) kao razmjenu strimova (tekstualni tokovi) – dugački nizovi bajtova
Tekstualne datoteke su nizovi sa maksimalno 255 znakova (red ili linija). Linije ne
završavaju sa \0, nego odgovarajućim EOL (End-Of-Line) terminatorom (CR-LF)
Svaki fajl treba da ima ime (u skladu sa pravilima za dati operativni sistem) –
najčešće niz slova (uključujući cifre) određene dužine (npr. DOS – 8 znakova)
char *f_ime_A = "datoteka.txt";
char *f_ime_B = "C:\temp\datoteka.txt";

2
9.2. Otvaranje i zatvaranje datoteke
OTVARANJE FAJLA?

Otvaranje datoteke
Otvaranje datoteka podrazumijeva:
otvaranje postojećeg fajla za čitanje postojećih i/ili dodavanje novih podataka
kreiranje novog fajla za upisivanje podataka
naziv datoteke
Otvaranje datoteke vrši se funkcijom čiji je prototip
FILE *fopen (char *f_ime, char *mode);

Način otvaranja datoteke


FILE = struktura definisana Funkcija fopen() “r” – za čitanje
u stdio.h otvara datoteku i “w” – za pisanje (ako fajl postoji,
članovi strukture se koriste vraća pointer na novi sadržaj se upisuje preko
kod pristupa datoteci (za strukturu FILE postojećeg)
korištenje ne treba poznavati “a” – za dodavanje podataka na kraj
strukturu FILE) Ako datoteka ne može
fajla (ako fajl već postoji, a
da se otvori
Za svaku datoteku koja se ako ne postoji otvara se novi)
(neodgovarajući mod
koristi treba deklarisati “a+”– za čitanje i dodavanje (ako
ili neispravan
po jedan pointer na FILE fajl već postoji, a ako ne
medijum) funkcija
postoji otvara se novi)
vraća NULL
3
9.2. Otvaranje i zatvaranje datoteke
OTVARANJE FAJLA?

Primjer:

#include <stdio.h> Ime datoteke: proba.txt


main() Mod rada: r
{ Datoteka uspjesno otvorena
FILE *fp; Datoteka proba.txt zatvorena
char f_ime[40], f_mode[4];

printf("Ime datoteke: ");


gets(f_ime);
printf("Mod rada: ");
gets(f_mode);

if ( (fp = fopen( f_ime, f_mode )) != NULL )


{
printf("Datoteka uspjesno otvorena\n");
zatvaranje fclose(fp);
datoteke printf("Datoteka %s zatvorena\n", f_ime);
}
else
printf("Greska u otvaranju\n");
}

4
9.3. Ulazno/izlazne operacije
PISANJE U FAJL?

Pisanje u tekstualnu datoteku


Upisivanje podataka u tekstualnu datoteku može da se izvodi na dva načina:
upisivanje podataka u formatiranom obliku (najčešće za numeričke podatke)
upisivanje podataka u neformatiranom obliku (najčešće za tekst)

Formatirani upis u datoteku


upisivanje podataka kao na standardni izlaz
int fprintf (FILE *fp, char *format, ...);

Funkcija analogna konverzioni string


Pointer na neku
funkciji printf() datoteku ranije
otvorenu za pisanje

5
9.3. Ulazno/izlazne operacije
PISANJE U FAJL?

Primjer:

#include <stdio.h>
main()
{
FILE *fp;
int i;
1
if ( (fp = fopen( "brojevi.dat" , "w" )) != NULL ) 2
{ 3
for (i=1; i<=5; i++) 4
fprintf(fp, "%d\n", i); 5
fclose(fp);
}
else
printf("Greska\n");
}

6
9.3. Ulazno/izlazne operacije
PISANJE U FAJL?

Neformatirani upis u tekstualnu datoteku


upisivanje jednog znaka
int putc (char c, FILE *fp);

znak koji se upisuje pointer na datoteku


u koju se upisuje

upisivanje stringa
int fputs (char *s, FILE *fp);

string koji se pointer na datoteku


upisuje u koju se upisuje

7
9.3. Ulazno/izlazne operacije
ČITANJE IZ FAJLA?

Čitanje iz tekstualne datoteke


Preporuka za čitanje iz tekstualne datoteke je da čitanje ide na isti način kao i upis:
formatirani podaci da se čitaju u formatiranom obliku
neformatirani podaci da se čitaju u neformatiranom obliku

Formatirano čitanje iz datoteke


čitanje podataka kao sa standardnog ulaza
int fscanf (FILE *fp, char *format, ...);

Funkcija analogna konverzioni string


Pointer na neku
funkciji scanf() datoteku ranije
otvorenu za čitanje

8
9.3. Ulazno/izlazne operacije
ČITANJE IZ FAJLA?

Primjer:

#include <stdio.h> Brojevi su:


main() 1.0 2.0 3.0 4.0 5.0
{
FILE *fp;
int i;
float niz[5];

if ( (fp = fopen( "brojevi.dat" , "r" )) != NULL )


{
for (i=0; i<5; i++)
fscanf(fp, "%f", &niz[i]);
fclose(fp);
printf("Brojevi su:\n");
for (i=0; i<5; i++)
printf("%4.1f ", niz[i]);
}
else
printf("Greska\n");
}

9
9.3. Ulazno/izlazne operacije
ČITANJE IZ FAJLA?

Neformatirano čitanje iz tekstualne datoteke


čitanje jednog znaka
int getc (FILE *fp);

čitanje stringa
char *fgets (char *s, int n, FILE *fp);

string koji se pointer na datoteku


učitava iz koje se čita

maksimalan broj
znakova u stringu
koji se učitava

10
9.3. Ulazno/izlazne operacije
ČITANJE IZ FAJLA?

Primjer:
#include <stdio.h>
main() Sadrzaj datoteke:
{ abcdefghijklmnopqrstuvwxy
FILE *fp;
int i;

if ( (fp = fopen( "tekst.txt" , "w" )) != NULL )


{
for (i=0; i<25; i++) putc('a'+i, fp);
fclose(fp);

if ( (fp = fopen( "tekst.txt" , "r" )) != NULL )


{
printf("Sadrzaj datoteke:\n");
while (!feof(fp)) printf("%c", getc(fp));
fclose(fp);
}
else printf("Greska kod otvaranja datoteke za citanje\n");
}
else printf("Greska kod otvaranja datoteke za pisanje\n");
}
11
9.3. Ulazno/izlazne operacije
ČITANJE IZ FAJLA?

Primjer:
#include <stdio.h> Sadrzaj datoteke:
main() abcdefghi
{
jklmnopqr
FILE *fp;
stuvwxy
int i; char s[10];

if ( (fp = fopen( "tekst.txt" , "w" )) != NULL )


{
for (i=0; i<25; i++) putc('a'+i, fp);
fclose(fp);

if ( (fp = fopen( "tekst.txt" , "r" )) != NULL )


{
printf("Sadrzaj datoteke:\n");
while (!feof(fp)) printf("%s\n", fgets(s,10,fp));
fclose(fp);
}
else printf("Greska kod otvaranja datoteke za citanje\n");
}
else printf("Greska kod otvaranja datoteke za pisanje\n");
}
12
9.4. Sekvencijalni i random pristup
PRISTUP DATOTECI?

Indikator pozicije
Svaka otvorena datoteka ima indikator trenutne pozicije (izražava se brojem
bajtova u odnosu na početak fajla)
 fp = fopen (“datoteka”, “w”);

 putc(‘A’, fp);
Indikator = 0
A

Indikator = 1  fputs (“string”, fp);


A s t r i n g

Indikator = 7

13
9.4. Sekvencijalni i random pristup
PRISTUP DATOTECI?

Manipulacija indikatorom pozicije


Vraćanje indikatora na početak datoteke

Indikator = 7

A s t r i n g

rewind(fp); Indikator = 0

Trenutna vrijednost indikatora pozicije


ftell(fp);

14
9.4. Sekvencijalni i random pristup
PRISTUP DATOTECI?
Prije upisa: 0
Poslije upisa: 6
Prije citanja: 0
Primjer: Sadrzaj: string 
#include <stdio.h> Poslije citanja: 6
main() Nakon premotavanja: 0
{
FILE *fp;

fp = fopen( "tekst.txt" , "w" );


printf("Prije upisa: %d\n", ftell(fp));
fputs("string", fp);
printf("Poslije upisa: %d\n", ftell(fp));
fclose(fp);

fp = fopen( "tekst.txt" , "r" );


printf("Prije citanja: %d\n", ftell(fp));
printf("Sadrzaj: ");
while (!feof(fp)) printf("%c", getc(fp));
printf("\nPoslije citanja: %d\n", ftell(fp));
rewind(fp);
printf("Nakon premotavanja: %d\n", ftell(fp));
fclose(fp);
}

15
9.4. Sekvencijalni i random pristup
PRISTUP DATOTECI?

Pozicioniranje na željenu (random) poziciju


Postavljanje indikatora pozicije na željenu poziciju vrši se funkcijom

int fseek (FILE *fp, long pomjeraj, int odakle);

Broj bajtova za
koliko se vrši
repozicioniranje pozicija u odnosu na koju se računa
pomjeraj:
0 – u odnosu na početak datoteke
1 – u odnosu na trenutnu poziciju
2 – u odnosu na kraj datoteke

16
9.4. Sekvencijalni i random pristup
PRISTUP DATOTECI?
Prije citanja: 0
Sadrzaj:
Banja
Primjer: Luka
Poslije citanja: 11
#include <stdio.h> Pocetak: B
main() Kraj: a
{
FILE *fp; char s[10];
fp = fopen( "tekst.txt" , "w" );
fputs("Banja\n", fp);
fputs("Luka", fp);
fclose(fp);
fp = fopen( "tekst.txt" , "r" );
printf("Prije citanja: %d\n", ftell(fp));
printf("Sadrzaj:\n");
while (!feof(fp)) printf("%s", fgets(s,10,fp));
printf("\nPoslije citanja: %d\n", ftell(fp));
fseek(fp,0,0); printf("Pocetak: %c\n", getc(fp));
fseek(fp,-1,2); printf("Kraj: %c\n", getc(fp));
fclose(fp);
}

17

You might also like