Datoteke - Teorija I Zadaci!!!!!!!

You might also like

Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 12

Datoteke se koriste za čuvanje podataka.

U programima mogu da budu izvor


podataka (umesto napornog unošenja ulaznih vrednosti) ili mesto gde se smeštaju
rezultati programa.

Važna karakteristika svake datoteke je njen format, a on predstavlja način


organizacije podataka u datoteci. Poznavanje formata je neophodno da bi
program mogao da koristi ili formira korektnu datoteku.
Programski jezik C poznaje dva tipa datoteka:
-tekstualne (nizovi znakova podeljeni u redove sa \n)
-binarne (nizovi bajtova koji predstavljaju podatke u memoriji).
Za korišćenje datoteka neophodno je uključiti zaglavlje “stdio.h” jer se u njemu
nalaze strukture podataka i funkcije koje se koriste za rad sa datotekama. Osnovna
struktura koja sadrži podatke o fajlu je FILE.

Pristup datoteci se ostvaruje pomoću pokazivača, a on se definiše na sledeći način:


FILE *pokdat;

Svaka datoteka koja se u programu koristi ( za čitanje ili za upis) mora da se otvori
pre nego što joj se prvi put pristupi.
Funkcija za otvaranje datoteke:
pokdat=fopen(char* ime_datoteke, char* režim)

1) ime_datoteke je niz znakova ( ime se zadaje relativnim putem u odnosu na radni


direktorijum ili direktno do mesta gde je datoteka na disku zapisana)
2) režim je oznaka koja pokazuje dozvoljeni način pristupa datoteci i može da bude:
“r” – čitanje iz datoteke ( “r+” – čitanje i upis),
“w” – upis u datoteku, tj. ako datoteka tog imena ne postoji ona se kreira, a ako već
postoji dolazi do brisanja njenog sadržaja prilikom otvaranja (“w+”- upis i čitanje),
“a” – dopisivanje novog sadržaja na kraj datoteke (“a+” – upis i čitanje, a pri
otvaranju pokazivač datoteke se postavlja na kraj datoteke).
ANSI standard pravi razliku između tekstualnih i binarnih datoteka, pa uz oznaku
režima treba dodati ‘b’ ukoliko se radi sa binarnom datotekom.

Funkcija fopen() vraća pokazivač na datoteku koja je otvorena, ili NULL ako
datoteka nije mogla da se otvori.
pr. pokdat = fopen(„prva“,“r“);
pr. if ( ( pokdat = fopen(„prva“, „r“ ) )== NULL ) printf(“Datoteka nije korektno
otvorena\n”);

Funkcija za zatvaranje datoteke


fclose(pokdat);
Ovom funkcijom se prekida veza koja postoji između pokazivača datoteke i imena
datoteke. Ukoliko je zatvaranje izvršeno uspešno, povratna vrednost ove funkcije je 0
( u svakom slučaju je ceo broj).

Standardna funkcija za čitanje jednog znaka (bajta) iz datoteke:


fgetc(pokdat)
Ako se pre učitavanja došlo do kraja datoteke rezultat funkcije je EOF ( konstanta
koja označava kraj datoteke (-1) ).

Funkcija za upis jednog znaka (bajta) u datoteku:


fputc(char c, pokdat)

Funkcija za čitanje jednog reda iz tekstualne datoteke:


fgets(string, maxbroj, pokdat)
Funkcijom se učitava jedan red (niz znakova do znaka ‘\n’) iz datoteke na koju
ukazuje pokdat. String je niz u koji se smešta učitani red, a maxbroj-1 je
maksimalni broj znakova koji se mogu učitati.

Funkcija za upis jednog reda u tekstualnu datoteku:


fputs(string, pokdat)

Funkcija za formatirano čitanje podataka iz tekstualne datoteke:


fscanf (pokdat, format [,argument]…)
Funkcija služi za čitanje podataka iz fajla na koji pokazuje pokdat. Funkcija vraća
broj podataka koji su učitani u argument, a ako se pojavi greška pri učitavanju
vrednost funkcije je -1.
Format definiše način na koji se učitani podaci iz fajla konvertuju u promenljive
koje su zadate kao argument (npr. “%d”, slično kao kod funkcije scanf()).
Argument je promenljiva u koju treba učitati vrednost. Tip argumenta mora da
odgovara formatu. Može postojati više parametara argument, s tim da broj
argumenata ovog tipa treba da odgovara broju specifikacija konverzija u formatu.

char znak, rec[20];


int ceobroj;
float realanbroj;
FILE *pokf;
pokf = fopen( “Dokument.txt”, “r” );
fscanf( pokf, “%c %s %d %f”, znak, rec, ceobroj, realanbroj );
fclose( pokf );

Funkcija za formatirani upis podataka u tekstualnu datoteku:


fprintf(pokdat, format [,argument]…)
Funkcija služi za upisivanje podataka u fajl na koji ukazuje pokdat. Povratna
vrednost predstavlja broj podataka koje je funkcija upisala u fajl. Ako se pojavi greška
pri učitavanju povratna vrednost je -1.

pokf1 = fopen( “Dokument1.txt”, “r” );


pokf2 = fopen( “Dokument2.txt”, “r” );
fscanf( pokf1, “%c %s %d %f”, znak, rec, ceobroj, realanbroj );
fprintf( pokf2, “%c %s %d %f”, znak, rec, ceobroj, realanbroj);

fclose( pokf1 );
fclose( pokf2 );

 Kreiranje tekstualne datoteke „Podaci.txt“ u radnom direktorijumu i upis


jednog reda koji sadrži: ime, pol, godište i prosek.

#include <stdio.h>
main() {
FILE *pokf;
char ime[10], pol;
int god, i;
float p;
pokf=fopen(„Podaci.txt“,“w“); //kreiranje novog fajla i upis jednog
reda//
fprintf( pokf, „Milan M 1990 4.75“ );
fclose (pokf);
}

 Dodavanje novih podataka u datoteku „Podaci.txt“.

#include <stdio.h>
main() {
FILE *pokf;
char ime[10],pol;
int god, i, n;
float p;

if ((pokf=fopen(„Podaci.txt“,“a“))==NULL) //otvaranje datoteke za ažuriranje//


puts(„Greska pri otvaranju“);
else
{
printf(„Koliko novih redova se unosi: \n“);
scanf („%d“, &n);
for (i=0; i<n; i++) {
printf(„Unesi ime, pol, godiste i prosek: \n“);
scanf („%s %c %d %f“, &ime, &pol, &god, &p); //unos podataka pomoću tastature//
fprintf (pokf,“\n%s %c %d %0.2f“, ime, pol, god, p); } //upis novog reda u datoteku//
fclose(pokf);
}
}

 Prikaz sadržaja postojeće datoteke Podaci.txt.

#include <stdio.h>
main() {
FILE *pokf;
char ime[10],pol;
int god, i, n, br;
float p;

pokf=fopen(„Podaci.txt“,“r“); //otvaranje fajla za čitanje//


br=1;
while (feof(pokf)==0) {
fscanf (pokf,“%s %c %d %f“, &ime, &pol, &god, &p); //čitanje jednog reda //

printf(„%d.%10s %c %d %0.2f\n“, br, ime, pol, god, p); //prikazivanje reda na


ekranu//
br++; }
fclose(pokf);
}

 Obrada datoteke (određivanje broja ženskih osoba i osoba sa prosekom većim


od 4.50 u datoteci Podaci.txt).

#include <stdio.h>
main() {
FILE *pokf;
char ime[10],pol;
int god, i, n, b1=0, b2=0;
float p;

pokf=fopen(„Podaci.txt“,“r“); //otvaranje tekstualnog fajla za čitanje//

while (feof(pokf)==0) {
fscanf (pokf,“%s %c %d %f“, &ime, &pol, &god, &p);
if (pol==’Z’) b1++;
if (p>=4.50 ) b2++; }
fclose(pokf);
printf(„Broj osoba zenskog pola: %d \n“,b1);
printf(„Broj odlicnih: %d\n“,b2);
}
 Program kojim se vrsi šifriranje podataka postojeće datoteke tekst.txt (sadrži
samo velika slova), tako što se svako slovo zamenjuje narednim ASCII znakom (
slovo Z zameniti sa A).

#include<stdio.h>
main()
{
int c;
FILE *prva,*druga;
prva=fopen(„tekst.txt“,“r“);
druga=fopen(„sifra.txt“,“w“);
while ((c=fgetc(prva))!=EOF)
{
if (‘A'<=c&&c<‘Z’) c++;
if(c==’Z’) c=’A’;
fputc(c,druga);
}
fclose(prva);
fclose(druga);
}

Datoteke su praktičan izvor podataka kojima se popunjavaju polja struktura.


Kreiraćemo tekstualnu datoteku studenti.txt koja sadrži rezultate polaganja
kolokvijuma grupe studenata. Svaki red bi trebalo da sadrži: ime, prezime i broj
bodova (0-100).

Datoteku možemo napraviti direktno u editoru teksta ili sledećim programom:


#include <stdio.h>
main() {
FILE *f;
char ime[15], prezime[20];
int br;
f=fopen(„studenti.txt“,“w“);
printf( ″ Unesi ime, prezime i broj bodova :\n″ );
while (scanf( f,“%s%s%d“,&ime, &prezime, &br) != EOF)
fprintf( f,“%s %s %d \n“, ime, prezime, br);

fclose (f);
}
Za prekid unosa podataka o studentima koristiti kombinaciju Ctrl+z ili Ctrl+c.

Od podataka iz datoteke studenti.txt napravićemo niz struktura, sortiraćemo ga u


opadajućem poretku (pomoću funkcije sort) i spisak onih koji imaju više od 50
bodova sačuvaćemo u novoj datoteci položili.txt.

#include<stdio.h>
struct student {
char ime[15];
char prezime[20];
int br;
};
void sort(student s[],int n) {
int i,j;
student p;
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
if(s[i].br<s[j].br)

{ p=s[i]; s[i]=s[j]; s[j]=p; }


}
main()
{
FILE *f;
struct student x[100];
int i, n=0;
f=fopen(„Studenti.txt“,“r“);
while ( fscanf (f, „%s%s%d“,&x[n].ime, &x[n].prezime, &x[n].br) != EOF)
n++;
fclose(f);
sort(x,n);
f=fopen(„Polozili.txt“,“w“);
for(i=0;i<n;i++)
if(x[i].br>50)
fprintf(p,“%s %s %d\n“, x[i].ime, x[i].prezime, x[i].br);
fclose(f);

U datotekama možemo da čuvamo različite brojčane podatke i oni mogu da se


obrađuju kao nizovi brojeva.
Kreiraćemo datoteku brojevi.txt (ručno u editoru teksta) koja sadrži samo cele
brojeve. U programu ćemo pročitati brojeve iz datoteke i samo pozitivne sačuvati u
novoj datoteci pozitivni.txt .

#include
int main() {
int x;
FILE *ulaz, *izlaz;
ulaz=fopen(„brojevi.txt“,“r“);
izlaz=fopen(„pozitivni.txt“,“w“);
while (!feof(ulaz))
{
fscanf(ulaz,“%d“,&x);
if (x>0) fprintf(izlaz,“%d „, x);
}

fclose(ulaz);
fclose(izlaz);
}

U sledećem programu od brojeva u datoteci brojevi.txt formiraćemo niz celih


brojeva i sortirati ga u rastućem poretku. Elemente novog niza i njihov ukupan
broj upisaćemo u datoteku niz.txt.

#include
main(){
int n=0, i, j, box;
float sv;
FILE *ulaz, *izlaz;
int x[100];
ulaz=fopen(„brojevi.txt“,“r“);
izlaz=fopen(„niz.txt“,“w“);
while (!feof(ulaz))
{
fscanf(ulaz,“%d“,&x[n]);

n++;
}
for (i=0;i<n-1;i++)
for (j=i+1;j<n;j++) if (x[i]>x[j])
{
box=x[i]; x[i]=x[j]; x[j]=box;
}
for (i=0;i<n;i++)
fprintf(izlaz,“%d \n“,x[i]);
fprintf(izlaz, „Ukupno ih ima:\n“);
fprintf(izlaz, „%d“, n);
fclose(ulaz);
fclose(izlaz);
}
Primer.

U datotekama grupa1.txt, grupa2.txt i grupa3.txt prati se rad učenika na vežbama


iz programiranja. U svakom redu datoteka je ime učenika, prosečna ocena vežbi i broj
vežbi koje je učenik propustio. Pročitati sve podatke i u datoteku izvestaj.txt upisati
sortirane učenike, njihove zaključne ocene i komentar da li je učenik zadovoljio
minimum rada na vežbama ( manje od 5 propuštenih vežbi).

#include<stdio.h>
#include<string.h>
#include<math.h>
struct grupa {
char ime[15];
float ocena;
int brn;
};
main() {
FILE *f;
struct grupa x[35],pom;
int i,n=0,j;

char dn[3][35];
f=fopen(„grupa1.txt“, „r“);
while(!feof(f)) {
fscanf(f,“%s %f %d“,&x[n].ime ,&x[n].ocena ,&x[n].brn);
n++;
}
fclose(f);
f=fopen(„grupa2.txt“, „r“);
while(!feof(f)) {
fscanf(f,“%s %f %d“,&x[n].ime ,&x[n].ocena ,&x[n].brn);
n++;
}
fclose(f);

f=fopen(„grupa3.txt“, „r“);
while(!feof(f)) {
fscanf(f,“%s %f %d“,&x[n].ime ,&x[n].ocena ,&x[n].brn);
n++;
}
fclose(f);
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
if(strcmp(x[i].ime, x[j].ime)>0)
{
pom=x[i];
x[i]=x[j];
x[j]=pom;
}

for(i=0;i<n;i++)
if(x[i].brn < 5) strcpy(dn[i],“da“);
else
strcpy(dn[i],“ne“);
f=fopen(„izvestaj.txt“,“w“);
for(i=0;i<n;i++)
fprintf(f,“%s %.f %s\n“,x[i].ime, x[i].ocena, dn[i]);
fclose(f);
}

You might also like