programiranje 2. semestar...programiranje 2 28 zadaci za vježbe 43. napisati program koji kopira...

15
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

Upload: others

Post on 23-Jan-2020

14 views

Category:

Documents


0 download

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, …).

Programiranje 2 (450/III)

Rad s datotekama 15

Rad s datotekama

KRAJ!!!