Download - uvod u programiranje predavanja 9
Увод у програмски језик Увод у програмски језик CC
Датотеке
Електротехнички факултет у Источном Сарајеву
2
СадржајСадржај
Рад са фајловимаРад са фајловима
Зашто користимо фајлове за У/И операцијеЗашто користимо фајлове за У/И операције
Фајлови и У/И операцијеФајлови и У/И операције
Отварање и затварање фајлаОтварање и затварање фајла
Рад са текстуалним фајловимаРад са текстуалним фајловима
Рад са бинарним фајловимаРад са бинарним фајловима
3
Фајлови и У/И операцијеФајлови и У/И операције
• Подаци које програм добије уносом са тастатуре односно подаци које програм прикаже на монитору су привременог трајања
• Рад са фајловима: трајно чување улазних и излазних података.
• Садржај фајлова остаје непромењен све док га сами не променимо или док то не уради програм.
4
Фајлови и У/И операцијеФајлови и У/И операције
• Подаци записани у фајлу могу да се користе неограничен број пута
• Може се креирати фајл са улазним подацима или да се прочита садржај фајла са излазним подацима и онда када се програм не извршава. (Едитор)
• Рад са великим бројем података
5
Фајлови и У/И операцијеФајлови и У/И операције
• Кад програм користи улазне податке из фајла онда кажемо да се подаци читају (reading) из фајла
• Кад програм шаље податке у фајл онда кажемо да пише (writing) податке у фајл.
• Према начину записа података у фајл разликујемо:
– текстуалне фајлове, и
– бинарне фајлове
6
Текстуални фајлови Текстуални фајлови
• Састоје се од низа знакова (карактера).• Сваки низ је знаком за прелазак у нови ред
(\n) подељен у редове. • Сваки знак је могуће приказати на
монитору (штампачу) или има одређену управљачку функцију (табулатор, прелазак у нови ред и сл.).
• Приликом записивања нумеричког податка (броја), неопходно је да се изврши конверзија у низ карактера
• Приликом читања података из улазног фајла неопходно је извршити конверзију у бинарни облик.
7
Текстуални фајловиТекстуални фајлови
8
Бинарни фајловиБинарни фајлови
• Састоје од низа бајтова чији је садржај верна слика начина представљања података у меморији рачунара.
• У току читања и записа података не пимењује се конверзија.
• Подаци из оваквих фајлова се не могу директно приказивати на монитору или на штампачу (конверзија).
9
Бинарни фајловиБинарни фајлови
10
• Сваки изворни програм који користи У/И функције мора бити повезан са #include<stdio.h>
• При раду да фајловима постоје следеће радње:
– отварање фајла
– приступ фајлу
– испитивање стања фајла
– затварање фајла
11
Отварање и затварање фајлаОтварање и затварање фајла
• Стандардне У/И функције користе меморију код преноса података.
• Потребна је информација о почетној адреси меморије, тренутној вредности показивача на адресу унутар те меморије, броју бајтова које треба пренети...
• Све ове информације су дефинисане у облику једне структуре као сложени тип података која се назива FILE.
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;
13
Отварање фајлаОтварање фајла
• Да би се приступило неком фајлу, фајл мора прво да се отвори.
• Отварање фајла представља повезивање фајла (применом показивача фајла) са програмом.
• Тек након отварања фајла програм може да чита податке из фајла или да уписује податке у фајл.
14
Отварање фајлаОтварање фајлаfopen(“putanja i ime fajla”,”mod_rada”);• r (read) читање из фајла. Фајл мора да постоји.• w (write) упис у фајл. Уколико фајл постоји брише се
његов садржај, а уколико не постоји формира се нови.• a (append), дописује податке на крај постојећег фајла.
Уколико фајл не постоји формира се нови.• r+ Отварање фајла за читање и писање. Фајл мора да
постоји.• w+ Отварање фајла за читање и писање.
Ако фајл постоји брише се његов садржај.Уколико фајл не постоји формира се нови.
• a+ Отварање фајла за читање и писање.Ако фајл постоји дописује податке на крај фајла.Уколико фајл не постоји формира се нови.
15
Отварање фајлаОтварање фајла
• За рад са бинарним фајловома претходним ознакама треба додати и слово b.
• Тиме се добија шест нових ознака:"rb" "wb" "ab" "rb+“ "wb+“ "ab+"
16
Затварање фајлаЗатварање фајла
• Код (регуларног) завршетка програма аутоматски се затварају сви фајлови
• Број фајлова који истовремено могу да буду отворени је ограничен.
• Затварање фајла :
int fclose(FILE *ptr_fajl);• Повратна вредност функције fclose је:
– 0 ако је фајл успешно затворен– Вредност различиту од нуле уколико је дошло
до грешке.
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" );
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( );}
19
Функције за читање и писањеФункције за читање и писање
• функција fgetc учитава један бајт из неког фајла. Њен прототип је дата са:
int fgetc( FILE *ptr_fajl );
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
21
Функције за читање и писањеФункције за читање и писање
fputc• Функција fputc исписује један бајт у неки
фајл.
int fputc( int c, FILE *ptr_fajl );– Повратна вредност ове функције је једнака
Вредности карактера који је уписан EOF уколико је дошло до грешке.
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++; }}
23
Функције за читање и писањеФункције за читање и писање
fgets• Учитава стринг из улазног фајла и смешта га у низ. • fgets учитава стринг од тренутне позиције у
фајлу до краја стринга или до знака за прелаз у нови ред (\n) или највише n-1 карактер.
fgets( char *niz, int n, FILE *p_fajl);
• Повратна вредност
– Вредности карактера који је уписан
– NULL уколико је дошло до грешке.
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
25
Функције за читање и писањеФункције за читање и писање
fputs• Функција fputs исписује стринг на
текућу позицију отвореног фајла.
fputs(char *niz, FILE *ptr_fajl );
• Повратна вредност– Ненегативној вредности ако је успешна – EOF уколико је дошло до грешке.
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);}
27
Пренос података са конверзијомПренос података са конверзијом
• Улазна и излазна конверзија података је позната из функција printf и scanf.
• Код рада са фајловима се користе две веома сличне функције fprintf и fscanf
• Bаже сва правила за конверзију али имају додатни, први аргумент, који представља показивач на фајл из којег се читају или у који се записују подаци.
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 );}
29
Рад са бинарним датотекамаРад са бинарним датотекама
fwritefwrite(void *bafer,int velicina,int broj,FILE
*ptr_ime);
• fwrite пише у означени фајл (ptr_ime) највише до broj вредности. Свака вредност захтева одговарајући број бајтова (velicina)вредности које се пишу треба да буду смештене у променљивој типа низ (bafer).
• Повратна вредност број вредности које су уписане.
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);}
31
Рад са бинарним датотекамаРад са бинарним датотекама
• freadfread(void *bаfer, int velicina, int broj, FILE *ptr_ime);
• fread чита из означеног фајла (ptr_ime) највише broj вредности величине velicina бајтова и памти их у променљивој типа низ (bаfer).
• Повратна вредност је једнака броју вредности које су прочитане.
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
33
Позиционирање унутар фајлаПозиционирање унутар фајла
fseek
fseek( FILE *ptr_ime, long offset, int origin );
origin• SEEK_CUR: означава тренутну вредност показивача• SEEK_ЕND: означава крај фајла• SEEK_SET: означава почетак фајла
34
Позиционирање унутар фајлаПозиционирање унутар фајла
ftell• Функција ftell даје тренутну вредност
показивача. Њен прототип је:
long ftell( FILE *ptr_ime);
35
Позиционирање унутар фајлаПозиционирање унутар фајла
feof• feof служи за испитивање да ли се
приликом читања дошло до краја фајла. int feof(FILE *ptr_ime);
• Повратна вредност
• 0 уколико тренутна вредност показивача није дошла до краја фајла
• различита од нуле уколико се дошло до краја фајла.
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); }
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);
}
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.
•
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 );
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 );
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); } }
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");
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);
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)
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.
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.
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.
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.
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.