programiranje 2. semestar...programiranje 2 28 zadaci za vježbe 43. napisati program koji kopira...
TRANSCRIPT
Programiranje 2 (450/III)
Rad s datotekama 1
Programiranje 2
Rad s datotekama
Programiranje 2 2
Sadržaj� Pristup datotekama
� Argumenti funkcije fopen� Povratna vrijednost funkcije fopen� Zatvaranje datoteke
� Rad s međuspremnikom� Pisanje i čitanje znaka� Formatirano čitanje i pisanje� Čitanje i pisanje niza znakova
� Automatska pretvorba tipova podataka� Dodatne funkcije za rad s datotekama
Programiranje 2 (450/III)
Rad s datotekama 2
Programiranje 2 3
Pristup datotekama� Funkcije za rad s datotekama su deklarirane u standardnoj biblioteci
- stdio.h
� Otvaranje datoteke – funkcija fopen
FILE *fopen( const char *imeDatoteke, const char *mod );
� FILE je struktura koja sadrži različite informacije neophodne za rad s datotekama.� Kako bi se moglo pristupiti datoteci potrebno je deklarirati
pokazivač na strukturu FILE.
Programiranje 2 4
Argumenti f-je fopen� Prvi argument je imeDatoteke – string koji sadrži:
� samo naziv datoteke i ekstenziju – ukoliko se datoteka nalazi u istom direktoriju kao i program
� “primjer.txt”� “proba.dat”� …
� čitavu stazu i ime datoteke ukoliko se datoteka nalazi u drugom direktoriju – umjesto ‘\’ se u stazi koristi ‘/’.
� “d:/c_vjezbe/vj_1.txt”
Programiranje 2 (450/III)
Rad s datotekama 3
Programiranje 2 5
Argumenti f-je fopen� Mod – string koji definira zašto se otvara datoteka:
� “r” – datoteka se otvara za čitanje;� ukoliko datoteka ne postoji funkcija fopen vrača NULL;
� “w” – otvara datoteku za pisanje;� ukoliko datoteka ne postoji – kreira se nova;� ukoliko datoteka postoji – njen sadržaj se briše i kreira
prazna datoteka;� “a” – otvara datoteku za pisanje;
� ukoliko datoteka ne postoji – kreira se nova;� ukoliko datoteka postoji – novi podaci se dodaju na kraj
postojećih;� “r+”, “w+”, “a+”� Uz ova 3 moda mogu ići još i razni dodatci: t, b,c, n, S, R, T, D.
Programiranje 2 6
Povratna vrijednost f-je fopen� Ovisno o modu s kojim je pozvana f-ja fopen može vratiti:
� pokazivač na strukturu FILE u kojoj su spremljeni relevantni podaci o otvorenoj datoteci;
� NULL ukoliko otvaranje nije provedeno uspješno.
Programiranje 2 (450/III)
Rad s datotekama 4
Programiranje 2 7
Primjer
� Pokrenemo program, a datoteka ne postoji:
� Pokrenemo program, a datoteka postoji:
struktura FILE
Programiranje 2 8
Zatvaranje datoteke� Zatvaranje datoteke je postupak koji je nužno provesti da bi se svi
podaci iz memorije, koji se jednim dijelom nalaze u međuspremniku strukture FILE, bili spremljeni na disk, te da bi se ispravno zapisao podatak o veličini datoteke.
� Zatvaranje datoteke se vrši pomoću funkcije fclose.
� Sintaksa:int fclose(FILE *fp);
� Povratna vrijednost:� 0 – ukoliko je zatvaranje uspješno obavljeno;� EOF – ukoliko pri zapisu podataka iz međuspremnika dođe do
greške.� Ukoliko se datoteka ne zatvori ona se “nasilno” zatvara na kraju
programa.
Programiranje 2 (450/III)
Rad s datotekama 5
Programiranje 2 9
Pražnjenje međuspremnika� Funkcija fflush forsira pražnjenje datotečnog međuspremnika i
ažurira stanje datoteke na disku bez zatvaranja datoteke.
� Sintaksa:int fflush (FILE *fp);
� Povratna vrijednost je kao kod funkcije fclose
Programiranje 2 10
Pisanje i čitanje znaka� Za upis i čitanje znaka iz datoteke koriste se funkcije:
� putc – upisuje 1 znak u datoteku;� getc – uzima 1 znak iz datoteke i vrača ga u program.
� Sintaksa:int putc(int znak, FILE *fp);
� znak – znak koji se želi upisati� fp – pokazivač na datoteku u koju se želi upisati znak� povratna vrijednost – znak koji je upisan
int getc(FILE *fp);
� fp – pokazivač na datoteku iz koje se čita znak� povratna vrijednost – ascii vrijednost pročitanog znaka
� Ukoliko getc vrati EOF došlo se do kraja datoteke.
Programiranje 2 (450/III)
Rad s datotekama 6
Programiranje 2 11
Primjer:� Napisati program koji unosi string s tastature, taj string se upisuje u
datoteku znak po znak. Kada se datoteka zatvori potrebno je otvoriti ponovo i njen sadržaj ispisati znak po znak na ekran.
Programiranje 2 12
Primjer:
1. putc
2. putc
Programiranje 2 (450/III)
Rad s datotekama 7
Programiranje 2 13
Primjer:
Programiranje 2 14
Primjer:
1. getc
2. getc
Programiranje 2 (450/III)
Rad s datotekama 8
Programiranje 2 15
Formatirano čitanje i pisanje datoteke� Za formatiran upis i čitanje podataka iz datoteke koriste se f-je:
� fprintf – upisuje niz znakova u datoteku u formatiranom obliku;� fscanf – čita formatirani niz znakova iz datoteke u varijable
definirane u programu. � Sintaksa:
int fprintf( FILE *fp, const char *format [, argument ]...);� fp – pokazivač na datoteku u koju se piše� povratna vrijednost – broj byte-ova koji su upisani u
datoteku
int fscanf( FILE *fp, const char *format [, argument ]... );� fp – pokazivač na datoteku iz koje se čita � povratna vrijednost:
� broj byte-ova koji su pročitani iz datoteke;� EOF – u koliko se došlo do kraja datoteke.
Programiranje 2 16
Što radi program?1. Datoteka ne postoji:
2. Datoteka postoji:
Programiranje 2 (450/III)
Rad s datotekama 9
Razlika text i binarnog moda� Kod Windows operacijskog sustava upisivanje prelaska u novi red uzima
1 bajt u binarnom, a 2 bajta u tekstualnom modu rada.
Programiranje 2 17
Programiranje 2 18
Upis niza znakova u datoteku� Za upis stringova u datoteke koristi se f-ja:
� fputs – upisuje niz znakova (1 liniju) u datoteku;
� Sintaksa:int fputs( const char *string, FILE *fp);
� string – pokazivač na niz znakova koji se želi upisati� fp – pokazivač na datoteku u koju se piše� povratna vrijednost – broj byte-ova koji su upisani u
datoteku
Programiranje 2 (450/III)
Rad s datotekama 10
Programiranje 2 19
Čitanje niza znakova iz datoteke� Za čitanje stringa (cijele linije) iz datoteke koriste se f-ja:
� fgets – čita N znakova iz datoteke, a ukoliko u toj liniji ima manje od N znakova kraj stringa je kraj kraj te linije.
� Sintaksa:char *fgets( char *string, int n, FILE * fp);
� string – adresa niza znakova gdje će se spremiti pročitani string
� n – maksimalni broj znakova koje će pročitati ova naredba� fp – pokazivač na datoteku iz koje se čita � povratna vrijednost:
� string koji je pročitan� NULL - u koliko se došlo do kraja datoteke.
Programiranje 2 20
Čitanje niza znakova iz datoteke� Za detekciju kraja datoteke kod funkcije fgets koristi se funkcija:
� feof
� Sintaksa:int feof( FILE *fp);
� fp - pokazivač na datoteku s kojom se trenutno radi� povratna vrijednost:
� 0 – ako nije dosegnut kraj datoteke� != 0 – ako se došlo do kraja datoteke
� U programu:� while ( feof( fp ) == 0)� while ( !feof( fp ))
Programiranje 2 (450/III)
Rad s datotekama 11
Korištenje f-je feof()
Programiranje 2 21
Programiranje 2 22
Što radi program?Ukoliko se želi idući string upisati u novi red obavezno treba navesti \n, jer će se inače slijedeći string upisati u istom redu.
Programiranje 2 (450/III)
Rad s datotekama 12
Programiranje 2 23
Standardni U/I tokovi (stream)� Koriste za unos podataka u računalo ili prezentaciju podataka iz
memorije i postoje tri predefinirana U/I toka:FILE *stderr, *stdin, *stdout;
� Pridružene (default) vrijednosti ovih pokazivača su:� stdin – standardni ulaz koji pokazuje na tastaturu;� stdout – standardni izlaz koji pokazuje na monitor;� stderr – standardna greška koja pokazuje na monitor.
� Ovi pokazivači se mogu koristiti kao argumenti svih funkcija za čitanje/pisanje podataka iz/u datoteke.
� Njihove vrijednosti su konstantne i ne mogu im se dodijeliti nove vrijednosti u programu.� Promjene standardnog ulaza i izlaza je moguće jedino napraviti na
razini operacijskog sustava.
Programiranje 2 24
Što radi dio koda?FILE *fp = fopen("primjer.txt", "w"); //1char a, red[100]; int x1; float x2;
for (a = 'a'; a < 'z'; a++) putc(a, fp); putc('\n', fp); fflush(fp); //2
fprintf(fp, "%d %f \n", 10, 1.5); fflush(fp); //3
fputs("Primjer f-ja putc, fprintf i fputs.", fp);fclose(fp); //4
fp = fopen("primjer.txt", "r");fgets(red, 100, fp); fputs(red, stdout);fscanf(fp," %d %f", &x1, &x2);printf(" %d %f", x1, x2);while ((a = getc(fp)) != EOF)
printf(" %c", a);fclose(fp);printf("\n\n", a);
1
3
2
4
Programiranje 2 (450/III)
Rad s datotekama 13
Neformatirano pisanje i čitanje � Za neformatirani upis i čitanje podataka u/iz datoteke koriste se
funkcije:� fwrite – neformatirano upisuje u datoteku predefinirani skup podataka � fread – čita iz datoteke neformatirano upisan skup podataka
� Sintaksa:� int fwrite(const void *buffer,size_t size, size_t count, FILE *fp);
� int fread( void *buffer, int size, int count, FILE *fp );
� buffer – početna adresa u memoriji na kojoj su ili će biti spremljeni podaci.
� size – veličina svakog podatka u bajtovima� count – ukupan broj podataka koje treba pročitati� fp – pokazivač na datoteku iz koje se čita
Programiranje 2 25
Neformatirano pisanje i čitanje
Programiranje 2 26
Programiranje 2 (450/III)
Rad s datotekama 14
Programiranje 2 27
Dodatne funkcije za rad s datotekama� fseek – pomiče pokazivač na datoteku za N mjesta u odnosu na trenutnu
poziciju.� fgetpos – uzima trenutnu poziciju u datoteci.� fsetpos – postavlja određenu poziciju u datoteci kao trenutnu.� rewind – postavlja se pokazivač na početak datoteke.� ftell – uzima trenutnu poziciju datoteke.� _fcloseall – zatvara sve otvorene datoteke. � _fflushall – forsira pohranu podataka iz međuspr. za sve otvorene datoteke.� getmaxstdio – vrača broj maks. dozvoljenih otvorenih datoteka u istovremeno.� _setmaxstdio – postavlja broj maksimalno dozvoljenih otvorenih datoteka
istovremeno.� tmpfile - stvori privremenu datoteku� _rmtmp – izbriši privremenu datoteku stvorenu s tmpfile. � setvbuf – Kontrola i postavljanje veličine međuspremnika. � … … …
Programiranje 2 28
Zadaci za vježbe43. Napisati program koji kopira jednu datoteku u drugu. Nazivi obije datoteke se
unose u glavnom programu, a kopiranje se radi u funkciji.
44. Napisati program koji iz datoteke znak, po znak čita znamenke sve dok ne pročita nešto što nije broj ili se dostigne kraj datoteke. Te znamenke je potrebno pretvoriti u broj koji je bio zapisan u datoteci i ispisati ga na ekran.
45. Napisati program koji iz datoteke čita maks. 100 podataka o osobama (ime, prezime i godinu rođenja) i traži koliko se osoba zove Ana. Čitanje datoteke i brojenje je potrebno napraviti u odvojenim f-jama.
46. Napisati program koji iz datoteke pročita 1 cijeli redak i onda ga riječ po riječ ispisuje na ekran, a svaka je riječ u svom retku.
� Datoteke potrebne za ove zadatke je potrebno napraviti u nekom tekstualnom editoru (Notepad, …).