P2_13 _datoteke

4

Click here to load reader

Transcript of P2_13 _datoteke

Page 1: P2_13 _datoteke

8/19/2019 P2_13 _datoteke

http://slidepdf.com/reader/full/p213-datoteke 1/5

©Programiranje 2 – 2009 ETF Beograd1/20

P2: Trinaesta nedelja

DatotekePrimena ulananih lista

©Programiranje 2 – 2009 ETF Beograd2/20

Zadatak 1

• Sastaviti program na programskom jeziku C zaspajanje sadržaja nekoliko sekvencijalnih tekstdatoteka u jednu izlaznu datoteku. Imenadatoteka se zadaju kao parametri u komandnojliniji. Ime izlazne datoteke je prvi parametar.Ukoliko je prvi parametar "-", izlazna datoteka jestdout.

©Programiranje 2 – 2009 ETF Beograd 3/20

Rad sa datotekama 1)

• Ulaz i izlaz podataka omoguava komunikaciju programa saspoljnim svetom – unos podataka, njihova obrada i odlaganje (ili prikaz) rezultata odgovarajue

obrade su osnova svakog ozbiljnijeg programa

• Za skladištenje velikih koli#ina podataka koriste se datoteke

• Prema na#inu skladištenja podataka postoje tekstualne ibinarne datoteke – tekst datoteke se sastoje od niza #itljivih znakova koji su logi #ki podeljeni u

redove, a za reprezentaciju znakova u memoriji koristi se ASCII tabela – binarne datoteke se sastoje od niza bajtova #iji sadržaj nije razumljiv oku #itaoca

• Datoteke na jeziku C su sekvencijalnog tipa – pristup je mogu samo prema redosledu smeštanja u datoteku

 – samo kod binarnih datoteka je mogue podesiti mesto (bajt) u datoteci od kogae po#eti sekvencijalni pristup

• Prilikom rada sa datotekama postoje sledee radnje:otvaranje datoteke, pristup datoteci, ispitivanje stanjadatoteke i zatvaranje datoteke

©Programiranje 2 – 2009 ETF Beograd 4/20

Rad sa datotekama 2)

• Sve funkcije za rad sa datotekama na jeziku C se nalaze ustandardnom zaglavlju <stdio.h> 

• Svaka datoteka koju želimo da koristimo u programu morabiti logi#ki povezana sa odgovarajuim pokaziva#em nastrukturu FILE

FILE *dat;

• Otvaranje datoteke:

FILE *fopen (char *filename, char *arg);– filename predstavlja fizi#ko ime datoteke na disku

– arg je string kojim se navodi na#in za pristup datoteci

 – osnovni režim - "r" - read, "w" - write, "a" – append

 – dodavanje + omoguava naizmeni#no #itanje i pisanje, bez obzira na osnovnirežim rada – "r+", "w+", "a+"

 – za rad sa binarnim datotekama, osnovnim argumentima treba dodati još slovo b– "rb", "wb+" i sl.

 – funkcija fopen() vraa pokaziva# na logi#ku strukturu tipa FILE ukoliko jepoziv uspešan ili NULL ako je poziv neuspešan (npr. nepostojea datoteka)

Page 2: P2_13 _datoteke

8/19/2019 P2_13 _datoteke

http://slidepdf.com/reader/full/p213-datoteke 2/5

©Programiranje 2 – 2009 ETF Beograd5/20

Rad sa datotekama 3)

• Zatvaranje datoteke:int fclose (FILE *dat);

• %itanje i pisanje bez konverzije:int fgetc (FILE *dat);int getc (FILE *dat);int fputc (int zn, FILE *dat);

int putc (int zn, FILE *dat);

 – vrednosti ovih funkcija je ili kod u#itanog/ispisanog znaka ili znak EOF ukoliko jedošlo do greške

 – znak EOF (end-of-file) ozna#ava kraj datoteke ili grešku

• %itanje i pisanje sa konverzijom:fscanf(FILE *, ...);fprintf(FILE *, ...);

 – ponašanje i argumenti isti kao kod regularnih scanf/printf funkcija

• Provera kraja datotekeint feof (FILE *dat);

• Na jeziku C postoje tri predefinisane datoteke koje seautomatski otvaraju: stdin (glavni ulaz), stdout (glavniizlaz) i stderr (izlaz za greške)

©Programiranje 2 – 2009 ETF Beograd6/20

Zadatak 1 - rešenje

#include <stdio.h> #include <string.h> 

void prepis (FILE *, FILE*);

void main (int argc, char *argv[]) {FILE *ulaz, *izlaz;char *prog = argv[0];

izlaz = stdout;if (argc > 1) {argc--;if (strcmp(*++argv, "-") != 0)if ((izlaz = fopen(*argv, "w")) == NULL) {

fprintf(stderr,"%s:greska u otvaranju datoteke%s\n",prog,*argv);

exit(1);}

}

©Programiranje 2 – 2009 ETF Beograd 7/20

Zadatak 1

 while(--argc > 0)if ((ulaz = fopen(*++argv, "r")) != NULL) prepis(ulaz, izlaz), fclose(ulaz);else {fprintf(stderr,"%s: ne postoji datoteka %s\n",

 progr, *argv);exit(2);

}

fclose(izlaz);exit (0);}

void prepis(FILE *ulaz, FILE *izlaz) {int c; while((c=getc(ulaz)) != EOF) putc(c, izlaz);

}

©Programiranje 2 – 2009 ETF Beograd 8/20

Zadatak 2 – ispravljanje slova 8.7)

• Napisati program na programskom jeziku C kojiispravlja greške zamenjenih vELIKIH i MalihsLoVa. Po#etak re#enice je prvo slovo od po#etkafajla, ili prvo slovo posle kraja prethodnere#enice. Kraj re#enice ozna#en je nekiminterpunkcijskim znakom (".","?","!"). Izme'ure#enica može da bude jedan ili više blankoznakova. Tekst se #ita iz fajla "recenice.pod", arezultat obrade se ispisuje u fajl "recenice.rez".

Page 3: P2_13 _datoteke

8/19/2019 P2_13 _datoteke

http://slidepdf.com/reader/full/p213-datoteke 3/5

©Programiranje 2 – 2009 ETF Beograd9/20

Zadatak 2 - rešenje

#include <stdio.h> #include <ctype.h> #include <string.h> 

void recenice (const char ulaz[], const char izlaz[]) {int zn, prvi=1;FILE *ul = fopen (ulaz, "r"), *izl = fopen (izlaz, "w"); while ((zn = fgetc (ul)) != EOF) {

if (isupper(zn)) {if (!prvi) zn += 'a' - 'A';else prvi = 0;

}else if (islower(zn))if (prvi) { zn += 'A' - 'a'; prvi = 0; }else if (zn=='.' || zn=='!' || zn=='?')

 prvi = 1;fputc (zn, izl);

}fclose (ul); fclose (izl);

}©Programiranje 2 – 2009 ETF Beograd

10/20

Zadatak 2

void main () {

char ulaz[30], izlaz[30];

 while (1) {

 printf ("Ime ulazne datoteke? ");

scanf ("%s", ulaz);

if (strcmp (ulaz, "***") == 0) break;

 printf ("Ime izlazne datoteke? ");scanf ("%s", izlaz);

if (strcmp (izlaz, "***") == 0) break;

recenice (ulaz, izlaz);

}

}

©Programiranje 2 – 2009 ETF Beograd 11/20

Zadatak 3

• Napisati program na programskom jeziku C kojira#una vrednost verižnog razlomka. Program #itapodatke iz datoteke "verizni.pod". U prvom reduove datoteke zapisan je ceo broj N, i potom još Nrealnih brojeva a[0], a[1],..., a[N-1]. U narednomredu su zapisana tri realna broja koji su redomdonja granica, gornja granica i korak promenlljive

 x. Izlaz se zapisuje u datoteku "verizni.rez". Napo#etku ove tekstualne datoteke treba zapisatiu#itane podatke, a potom tabelirati verižnufunkciju.

©Programiranje 2 – 2009 ETF Beograd 12/20

Zadatak 3 - rešenje

/* verizni.c - Izracunavanje vrednosti veriznograzlomka */

#include <stdio.h> 

#define N 30

double v (double a[], int n, double x) {

int i; double u = 0;for (i=n-1; i>=0; u=a[i--]/(x+u));

return u;

}

Page 4: P2_13 _datoteke

8/19/2019 P2_13 _datoteke

http://slidepdf.com/reader/full/p213-datoteke 4/5

©Programiranje 2 – 2009 ETF Beograd

13/20

Zadatak 3

void main () {double a[N], x, xmin, xmax, dx;int n, i;FILE *ul, *izl;ul = fopen ("verizni.pod", "r");izl = fopen ("verizni.rez", "w");fscanf (ul, "%d", &n); fprintf (izl, "A=");for (i=0; i<n; i++) {fscanf (ul, "%lf", &a[i]);

fprintf (izl, " %.2f", a[i]);}fputc ('\n', izl);fscanf (ul, "%lf%lf%lf", &xmin, &xmax, &dx);fprintf (izl, "xmin, xmax, dx= %.2f, %.2f, %.2f\n", xmin, xmax,dx);fprintf (izl, "\n x v(x)\n"

"======================\n");for (x=xmin; x<=xmax; x+=dx)fprintf (izl, "%10.2f%12.2f\n",

x, v(a,n,x));fclose (ul); fclose (izl);

}

©Programiranje 2 – 2009 ETF Beograd

14/20

Zadatak 4 – binarne datoteke C120)

• Data je binarna datoteka vlasnici.dat koja je formirana naosnovu informacija o vlasnicima kunih ljubimaca. Svakizapis u datoteci sadrži ime i prezime vlasnika (maksimalno30 karaktera), ime kunog ljubimca (maksimalno 20karaktera), informaciju da li je ljubimac vakcinisan (jedankarakter) i identifikacioni zapis. Identifikacioni zapis sadržišifru ljubimca (ceo broj) i jedan karakter koji ozna#ava

vrstu ljubimca ('P' za pse, 'M' za ma#ke i 'O' za ostale vrste).Napisati program na programskom jeziku C koji na osnovusadržaja navedene datoteke formira listu samo onih zapisakoji se odnose na ma#ke. Zatim je potrebno sa standardnogulaza #itati šifre ma#aka sve dok se ne unese negativnavrednost. Za svaku u#itanu šifru ma#ke, potrebno jeproveriti da li je ma#ka vakcinisana, i u slu#aju da nije,ispisati informacije o njenom vlasniku na standardnomizlazu. Podrazumeva se da datoteka vlasnici.dat ve postoji.

©Programiranje 2 – 2009 ETF Beograd 15/20

Rad sa binarnim datotekama

• Binarna datoteka se mora otvoriti na odgovarajui na#in ("rb","wb", "rb+"…)

• %itanje i pisanje podatakasize_t fread(void *adr, size_t size, size_t count,FILE *dat);

size_t fwrite(void *adr, size_t size, size_t count,FILE *dat);

(stddef.h: typedef unsigned int size_t;)

– adr je adresa od koje se vrši smeštanje pro#itanih/ispisivanje podataka

– size je veli#ina pojedina#nog podatka, count broj podataka

–dat je datoteka iz koje se #ita ili u koju se piše

• Pozicioniranje u datoteci u odnosu na zadati reperint fseek(FILE *dat,long pomeraj, int reper);

 – reperne ta#ke SEEK_SET (po#etak datoteke), SEEK_CUR (trenutna pozicija),SEEK_END (kraj datoteke)

• Odre'ivanje trenutne pozicije u datotecilong ftell (FILE *dat);

• Povratak na po#etak datotekevoid rewind (FILE *dat);

©Programiranje 2 – 2009 ETF Beograd 16/20

Zadatak 4 - rešenje

#include <stdio.h> #include <stdlib.h> 

typedef struct id {int broj;char vrsta;

} identifikacioni_zapis;

typedef struct zapis {char ime_vlasnika[31];char ime_ljubimca[21];char vakcina;

identifikacioni_zapis id_zapis;} Zapis;

typedef struct element_liste {Zapis z;element_liste *sled;

} Element_liste;

typedef struct lista {Element_liste *prvi;Element_liste *poslednji;

} Lista;

Page 5: P2_13 _datoteke

8/19/2019 P2_13 _datoteke

http://slidepdf.com/reader/full/p213-datoteke 5/5

©Programiranje 2 – 2009 ETF Beograd

17/20

Zadatak 4

Lista *napraviListu(){Lista *l = malloc( sizeof(Lista) );if( l )

l->prvi = l->poslednji = NULL;return l;

}

void obrisiListu(Lista *l) {

if( ! l ) return;

 while( l->prvi ) {Element_liste *tek = l->prvi;

l->prvi = l->prvi->sled;free(tek);

}free(l);

}

©Programiranje 2 – 2009 ETF Beograd

18/20

Zadatak 4

void dodajUListu(Lista *l, Zapis *zap) {Element_liste *novi;

if( ! l || ! zap ) return;novi = malloc( sizeof(Element_liste) );if( ! novi ) {

 printf("Neuspela alokacija memorije!\n");exit(0);

}

strcpy(novi->z.ime_vlasnika, zap->ime_vlasnika);strcpy(novi->z.ime_ljubimca, zap->ime_ljubimca);novi->z.vakcina = zap->vakcina;novi->z.id_zapis = zap->id_zapis;novi->sled = NULL;

if( ! l->prvi )l->prvi = novi;

elsel->poslednji->sled = novi;

l->poslednji = novi;}

©Programiranje 2 – 2009 ETF Beograd 19/20

Zadatak 4

void pronadjiNevakcinisane(Lista *l, char tip) {

if( ! l ) return;

 printf("Vlasnici ciji ljubimci nisuvakcinisani:\n");

Element_liste *tek = l->prvi;

 while(tek){

if(tek->z.id_zapis.vrsta == tip &&tek->z.vakcina == 0)

 printf("%s\n", tek->z.ime_vlasnika);

tek = tek->sled;

}

}

©Programiranje 2 – 2009 ETF Beograd 20/20

Zadatak 4

void main() {FILE *f = fopen("vlasnici.dat", "rb");Zapis z;Lista l;if( ! f ) {

 printf("Neuspelo otvaranje datoteke 'vlasnici.dat'\n");return;

}l = napraviListu();if( ! l ) {

 printf("Neuspelo stvaranje liste\n");return;}

 while( fread(&z, sizeof(Zapis), 1, f) == 1 )if( z.id_zapis.vrsta == 'M' ) dodajUListu(&l, &z);

fclose(f); pronadjiNevakcinisane(&l, 'M');obrisiListu(&l);

}