uvod u programiranje predavanja 9

49
Увод у програмски Увод у програмски језик језик C C Датотеке Електротехнички факултет у Источном Сарајеву

Upload: dragan-kikic

Post on 04-Jan-2016

261 views

Category:

Documents


5 download

DESCRIPTION

uvod u programiranje

TRANSCRIPT

Page 1: uvod u programiranje predavanja 9

Увод у програмски језик Увод у програмски језик CC

Датотеке

Електротехнички факултет у Источном Сарајеву

Page 2: uvod u programiranje predavanja 9

2

СадржајСадржај

Рад са фајловимаРад са фајловима

Зашто користимо фајлове за У/И операцијеЗашто користимо фајлове за У/И операције

Фајлови и У/И операцијеФајлови и У/И операције

Отварање и затварање фајлаОтварање и затварање фајла

Рад са текстуалним фајловимаРад са текстуалним фајловима

Рад са бинарним фајловимаРад са бинарним фајловима

Page 3: uvod u programiranje predavanja 9

3

Фајлови и У/И операцијеФајлови и У/И операције

• Подаци које програм добије уносом са тастатуре односно подаци које програм прикаже на монитору су привременог трајања

• Рад са фајловима: трајно чување улазних и излазних података.

• Садржај фајлова остаје непромењен све док га сами не променимо или док то не уради програм.

Page 4: uvod u programiranje predavanja 9

4

Фајлови и У/И операцијеФајлови и У/И операције

• Подаци записани у фајлу могу да се користе неограничен број пута

• Може се креирати фајл са улазним подацима или да се прочита садржај фајла са излазним подацима и онда када се програм не извршава. (Едитор)

• Рад са великим бројем података

Page 5: uvod u programiranje predavanja 9

5

Фајлови и У/И операцијеФајлови и У/И операције

• Кад програм користи улазне податке из фајла онда кажемо да се подаци читају (reading) из фајла

• Кад програм шаље податке у фајл онда кажемо да пише (writing) податке у фајл.

• Према начину записа података у фајл разликујемо:

– текстуалне фајлове, и

– бинарне фајлове

Page 6: uvod u programiranje predavanja 9

6

Текстуални фајлови Текстуални фајлови

• Састоје се од низа знакова (карактера).• Сваки низ је знаком за прелазак у нови ред

(\n) подељен у редове. • Сваки знак је могуће приказати на

монитору (штампачу) или има одређену управљачку функцију (табулатор, прелазак у нови ред и сл.).

• Приликом записивања нумеричког податка (броја), неопходно је да се изврши конверзија у низ карактера

• Приликом читања података из улазног фајла неопходно је извршити конверзију у бинарни облик.

Page 7: uvod u programiranje predavanja 9

7

Текстуални фајловиТекстуални фајлови

Page 8: uvod u programiranje predavanja 9

8

Бинарни фајловиБинарни фајлови

• Састоје од низа бајтова чији је садржај верна слика начина представљања података у меморији рачунара.

• У току читања и записа података не пимењује се конверзија.

• Подаци из оваквих фајлова се не могу директно приказивати на монитору или на штампачу (конверзија).

Page 9: uvod u programiranje predavanja 9

9

Бинарни фајловиБинарни фајлови

Page 10: uvod u programiranje predavanja 9

10

• Сваки изворни програм који користи У/И функције мора бити повезан са #include<stdio.h>

• При раду да фајловима постоје следеће радње:

– отварање фајла

– приступ фајлу

– испитивање стања фајла

– затварање фајла

Page 11: uvod u programiranje predavanja 9

11

Отварање и затварање фајлаОтварање и затварање фајла

• Стандардне У/И функције користе меморију код преноса података.

• Потребна је информација о почетној адреси меморије, тренутној вредности показивача на адресу унутар те меморије, броју бајтова које треба пренети...

• Све ове информације су дефинисане у облику једне структуре као сложени тип података која се назива FILE.

Page 12: uvod u programiranje predavanja 9

12

FILE FILE структураструктура

struct _iobuf { char _ptr; /* trenutna pozicija pokazivaca */ int _cnt; /* trenutno stanje broja bajtova */ char *_base; /* polazna adresa rezer. memorije

*/ int _flag; /* indikator */ int _file; /* brojna oznaka fajla */} FILE;

Page 13: uvod u programiranje predavanja 9

13

Отварање фајлаОтварање фајла

• Да би се приступило неком фајлу, фајл мора прво да се отвори.

• Отварање фајла представља повезивање фајла (применом показивача фајла) са програмом.

• Тек након отварања фајла програм може да чита податке из фајла или да уписује податке у фајл.

Page 14: uvod u programiranje predavanja 9

14

Отварање фајлаОтварање фајлаfopen(“putanja i ime fajla”,”mod_rada”);• r (read) читање из фајла. Фајл мора да постоји.• w (write) упис у фајл. Уколико фајл постоји брише се

његов садржај, а уколико не постоји формира се нови.• a (append), дописује податке на крај постојећег фајла.

Уколико фајл не постоји формира се нови.• r+ Отварање фајла за читање и писање. Фајл мора да

постоји.• w+ Отварање фајла за читање и писање.

Ако фајл постоји брише се његов садржај.Уколико фајл не постоји формира се нови.

• a+ Отварање фајла за читање и писање.Ако фајл постоји дописује податке на крај фајла.Уколико фајл не постоји формира се нови.

Page 15: uvod u programiranje predavanja 9

15

Отварање фајлаОтварање фајла

• За рад са бинарним фајловома претходним ознакама треба додати и слово b.

• Тиме се добија шест нових ознака:"rb" "wb" "ab" "rb+“ "wb+“ "ab+"

Page 16: uvod u programiranje predavanja 9

16

Затварање фајлаЗатварање фајла

• Код (регуларног) завршетка програма аутоматски се затварају сви фајлови

• Број фајлова који истовремено могу да буду отворени је ограничен.

• Затварање фајла :

int fclose(FILE *ptr_fajl);• Повратна вредност функције fclose је:

– 0 ако је фајл успешно затворен– Вредност различиту од нуле уколико је дошло

до грешке.

Page 17: uvod u programiranje predavanja 9

17

ПримерПример#include <stdio.h>main( ){ FILE *ptr_file1, *ptr_file2 ; int i;

ptr_file1=NULL; ptr_file2=NULL; /* Otvori za citanje */ ptr_file1 = fopen("data1.txt", "r" ) if(ptr_file1 == NULL ) printf( "Fajl NIJE otvoren\n" ); else printf( "\nFajl je otvoren \n" );

Page 18: uvod u programiranje predavanja 9

18

/* Otvori fajl za citanje i upis */ ptr_file2 = fopen( "data2.txt", "w+" )

/* Zatvori prvi fajl */ i= fclose(ptr_file1 ) if(i!=0) printf( " Fajl NIJE zatvoren\n " ); else printf( " Fajl je zatvoren\n " );

/* Svi preostali fajlovi se zatvaraju: */ fcloseall( );}

Page 19: uvod u programiranje predavanja 9

19

Функције за читање и писањеФункције за читање и писање

• функција fgetc учитава један бајт из неког фајла. Њен прототип је дата са:

int fgetc( FILE *ptr_fajl );

Page 20: uvod u programiranje predavanja 9

20

Пример Пример fgetcfgetc#include <stdio.h>main( ){ FILE *ptr_ulaz; char buffer[81]; int i, ch; ptr_ulaz=fopen("opis.txt","r"); for(i=0; (i < 80 ); i++ ) { ch = fgetc( ptr_ulaz ); buffer[i] = (char)ch; }

buffer[i] = '\0';printf( "%s\n", buffer );fclose( ptr_ulaz );}

FGETC.C: This program uses getc to read the first 80 input characters (or until

Page 21: uvod u programiranje predavanja 9

21

Функције за читање и писањеФункције за читање и писање

fputc• Функција fputc исписује један бајт у неки

фајл.

int fputc( int c, FILE *ptr_fajl );– Повратна вредност ове функције је једнака

Вредности карактера који је уписан EOF уколико је дошло до грешке.

Page 22: uvod u programiranje predavanja 9

22

Пример Пример ffputputcc#include <stdio.h>void main( void ){ FILE *ptr_out; char niz[] = "Ovo je primer za fputc!\n"; int i;

ptr_out = fopen( "upis.txt", "w" ) i=0;

while(niz[i]!= '\0') { fputc(niz[i] , ptr_out ) i++; }}

Page 23: uvod u programiranje predavanja 9

23

Функције за читање и писањеФункције за читање и писање

fgets• Учитава стринг из улазног фајла и смешта га у низ. • fgets учитава стринг од тренутне позиције у

фајлу до краја стринга или до знака за прелаз у нови ред (\n) или највише n-1 карактер.

fgets( char *niz, int n, FILE *p_fajl);

• Повратна вредност

– Вредности карактера који је уписан

– NULL уколико је дошло до грешке.

Page 24: uvod u programiranje predavanja 9

24

Пример Пример fgetsfgets

#include <stdio.h>void main( void ){ FILE *ptr_ulaz; char niz[50]; ptr_ulaz = fopen("ulaz.txt", "r") fgets( niz, 40, ptr_ulaz ) printf( "%s\n", niz); fclose( ptr_ulaz); } Ovo je primer za funkciju fgets. U ovom

Page 25: uvod u programiranje predavanja 9

25

Функције за читање и писањеФункције за читање и писање

fputs• Функција fputs исписује стринг на

текућу позицију отвореног фајла.

fputs(char *niz, FILE *ptr_fajl );

• Повратна вредност– Ненегативној вредности ако је успешна – EOF уколико је дошло до грешке.

Page 26: uvod u programiranje predavanja 9

26

#include <stdio.h>void main( void ){ FILE *ptr_out; char niz[] = "Ovo je primer za fputs!";

ptr_out = fopen("upis.txt", "w")

fputs(niz, ptr_out);

fclose(ptr_out);}

Page 27: uvod u programiranje predavanja 9

27

Пренос података са конверзијомПренос података са конверзијом

• Улазна и излазна конверзија података је позната из функција printf и scanf.

• Код рада са фајловима се користе две веома сличне функције fprintf и fscanf

• Bаже сва правила за конверзију али имају додатни, први аргумент, који представља показивач на фајл из којег се читају или у који се записују подаци.

Page 28: uvod u programiranje predavanja 9

28

ПримерПример

#include <stdio.h>FILE *ptr_fajl;void main( void ){ int i = 10; double fp = 1.5; char niz[] = "Ovo je jedan niz podataka"; char karakter = '\n'; ptr_fajl = fopen( "izlaz.txt", "w" ); fprintf( ptr_fajl, "%s%c", niz, karakter ); fprintf( ptr_fajl, "%d\n", i ); fprintf( ptr_fajl, "%f\n", fp ); fclose( ptr_fajl );}

Page 29: uvod u programiranje predavanja 9

29

Рад са бинарним датотекамаРад са бинарним датотекама

fwritefwrite(void *bafer,int velicina,int broj,FILE

*ptr_ime);

• fwrite пише у означени фајл (ptr_ime) највише до broj вредности. Свака вредност захтева одговарајући број бајтова (velicina)вредности које се пишу треба да буду смештене у променљивој типа низ (bafer).

• Повратна вредност број вредности које су уписане.

Page 30: uvod u programiranje predavanja 9

30

#include <stdio.h>void main( void ){ FILE *ptr_izlaz; list[]={1,2,3,4,5,16,7,683,9,10,11,12,13,14};

ptr_izlaz = fopen("izlaz.txt","wb") fwrite( list, sizeof( int ), 10, ptr_izlaz ); fclose( ptr_izlaz);}

Page 31: uvod u programiranje predavanja 9

31

Рад са бинарним датотекамаРад са бинарним датотекама

• freadfread(void *bаfer, int velicina, int broj, FILE *ptr_ime);

• fread чита из означеног фајла (ptr_ime) највише broj вредности величине velicina бајтова и памти их у променљивој типа низ (bаfer).

• Повратна вредност је једнака броју вредности које су прочитане.

Page 32: uvod u programiranje predavanja 9

32

...ptr_ulaz = fopen( "izlaz.txt", "rb" ) fread(list2, sizeof(int), 10, ptr_ulaz);printf( "Sadrzaj niza list2 je \n");

for(i=0; i<10;i++)printf( "%d ",list2[i]);

fclose( ptr_ulaz );...1 2 3 4 5 16 7 683 9 10

Page 33: uvod u programiranje predavanja 9

33

Позиционирање унутар фајлаПозиционирање унутар фајла

fseek

fseek( FILE *ptr_ime, long offset, int origin );

origin• SEEK_CUR: означава тренутну вредност показивача• SEEK_ЕND: означава крај фајла• SEEK_SET: означава почетак фајла

Page 34: uvod u programiranje predavanja 9

34

Позиционирање унутар фајлаПозиционирање унутар фајла

ftell• Функција ftell даје тренутну вредност

показивача. Њен прототип је:

long ftell( FILE *ptr_ime);

Page 35: uvod u programiranje predavanja 9

35

Позиционирање унутар фајлаПозиционирање унутар фајла

feof• feof служи за испитивање да ли се

приликом читања дошло до краја фајла. int feof(FILE *ptr_ime);

• Повратна вредност

• 0 уколико тренутна вредност показивача није дошла до краја фајла

• различита од нуле уколико се дошло до краја фајла.

Page 36: uvod u programiranje predavanja 9

36

Ilustracija fopen() funkcijeIlustracija fopen() funkcije

• Sledeći deo koda ilustruje rad fopen funkcije i testira da li je ona pravilno odradila posao:

#include <stdio.h> FILE *input_file, *fopen (); input_file = fopen("datain", "r"); if( input_file == NULL ) { printf("*** datain could not be opened.\

n"); printf("returning to dos.\n"); exit(1); }

Page 37: uvod u programiranje predavanja 9

37

Ilustracija fopen() funkcijeIlustracija fopen() funkcije

• Otvaranje i testiranje uspešnosti mogu biti kombinovani na sledeći način

if(( input_file = fopen ("datain", "r" )) == NULL )

{

printf("*** datain could not be opened.\n"); printf("returning to dos.\n"); exit(1);

}

Page 38: uvod u programiranje predavanja 9

38

Preuzimanje i dodavanje u fajlPreuzimanje i dodavanje u fajl

• Pojedinačni karakteri mogu biti pročitani ili upisani u fajl korišćenjem funkcija getc() i putc().

• Obratite pažnju, ove funkcije su slične funkcijama getchar() i putchar(), osim što se kod getc() i putc() kao argument prilikom poziva mora navesti i ulazno/izlazni uređaj sa kojim se radi.

Page 39: uvod u programiranje predavanja 9

39

Узимање и додавање податакаУзимање и додавање података

• Пример int ch; ch = getc( input_file ); /* assigns character to ch */

• getc() takođe vraća i EOF (end of file), tako da

while( (ch = getc( input_file )) != EOF )

• Dodavanje novog reda u fajl:

putc('\n', output_file );

Page 40: uvod u programiranje predavanja 9

40

Затварање фајлаЗатварање фајла

• Kada se rad sa fajlom završi, potrebno je zatvoriti taj fajl, pre završetka rada programa.

• Ovo se radi da bi operativni sistem oslobodio sve resurse koje je rezervisao za fajl: memoriju, bafere i slično,

• Za ovaj proces je zadužena funkcija fclose(), kojoj se prosleđuje pokazivač na određeni fajl kao argument.

fclose( input_file );

fclose( output_file );

Page 41: uvod u programiranje predavanja 9

41

Копирање фајловаКопирање фајлова#include <stdio.h> main() /* FCOPY.C */ { char in_name[25], out_name[25]; FILE *in_file, *out_file, *fopen (); int c; printf("File to be copied:\n"); scanf("%24s", in_name); printf("Output filename:\n"); scanf("%24s", out_name); in_file = fopen ( in_name, "r"); if( in_file == NULL ) printf("Cannot open %s for reading.\n", in_name); else { out_file = fopen (out_name, "w"); if( out_file == NULL ) printf("Can't open %s for writing.\n",out_name); else { while( (c = getc( in_file)) != EOF ) putc (c, out_file); putc (c, out_file); /* copy EOF */ printf("File has been copied.\n"); fclose (out_file); } fclose (in_file); } }

Page 42: uvod u programiranje predavanja 9

42

Testiranje za kraj fajlaTestiranje za kraj fajla

• Za ovo služi funkcija feof() koja je standardna funkcija iz biblioteke stdio.h.

• Ova funkcija vraća vrednost 1, ako prosleđeni pokazivač, pokazuje na kraj fajla

if( feof ( input_file ))

printf("Ran out of data.\n");

Page 43: uvod u programiranje predavanja 9

43

fprintf() i fscanf()fprintf() i fscanf()

• fprintf() i fscanf() rade isto kao i printf() i scanf(), osim što rade sa fajlovima.

• Prouči šta će da uradi:

fprintf(output_file, "Now is the time for all..\n");

fscanf(input_file, "%f", &float_value);

Page 44: uvod u programiranje predavanja 9

44

fgets() i fputs() funkcije fgets() i fputs() funkcije

• Korisne su kada se iz fajla čita, ili u fajl upisuje ceo red podataka.

• Ako je buffer pokazivač na karakter, i n najveći broj karaktera koji će biti preuzeti onda:

fgets (buffer, n, input_file);

• Ovaj iskaz preuzima iz fajla u buffer, sve karaktere do NULL karaktera, ili do n karaktera, i na kraju tog niza stavlja NULL karakter

fputs (buffer, output_file);

• Ovaj iskaz ubacuje u fajl sve karaktere iz bafera sve dok ne dođe do NULL karaktera, i pravi novi red u izlaznom fajlu (NULL karakter se ne prebacuje)

Page 45: uvod u programiranje predavanja 9

45

Rad sa fajlovima koršćenjem Rad sa fajlovima koršćenjem open(), read(), write() open(), read(), write() and close()and close()

• Prethodni primeri se odnose na rad sa kontrolnim blokovima fajlova. Međutim pod operativnim sistemima DOS i UNIX, sa fajlovima se radi korišćenjem tkzv handles, a ne kontrolnih blokovima.

• Korišćenje ovog koncepta omogućuje potpunu prenosivost progarama.

• Takođe, pod ovim konceptom programer tretira fajl kao tok podataka.

Page 46: uvod u programiranje predavanja 9

46

open()open()

#include <fcntl.h>

int open( char *filename, int access, int permission );

• The available access modes are

• O_RDONLY O_WRONLY O_RDWR O_APPEND O_BINARY O_TEXT

• The permissions are

• S_IWRITE S_IREAD S_IWRITE | S_IREAD

• U slučaju neuspešnog otvaranja vraća se vrednost -1.

Page 47: uvod u programiranje predavanja 9

47

read()read()

#include <fcntl.h>

int read( int handle, void *buffer, int nbyte );

• Čita n bajtova fajla na koji ukazuje handle, i smešta u bafer.

• Vraća broj pročitanih bajtova, 0 ako je na kraju fajla, i -1 u slučaju greške.

Page 48: uvod u programiranje predavanja 9

48

write()write()

#include <fcntl.h>

int write( int handle, void *buffer, int nbyte );

• Funkcija upisuje n bajtova iz bafera u fajl na koji ukazuje handle.

• Vrača broj upisanih bajtova, ili -1 ukoliko je došlo do greške.

Page 49: uvod u programiranje predavanja 9

49

close()close()

#include <fcntl.h>

int close( int handle );

• Ova funkcija zatvara fajl na koji upućuje handle.

• Funkcija vraća 0 ako je fajl uspešno zatvoren, i -1, ako je došlo do greške.