BINARNE DATOTEKE
Informacije se u datoteke zapisuju u kodiranom obliku. Utemeljna su dva načina kodiranog zapisa: binarni i tekstualni (ili
formatirani). Kaže se da je zapis izvršen u binarnu datoteku kada se informacije na disk zapisuju u istom binarnom obliku
kako su kodirane u memoriji računara.U tekstualne datoteke se zapis vrši formatirano pomoću niza ASCII znakova, na isti
način kako se vrši tekstualni ispis na video monitoru, primer printf() funkcijom. Sadržaj tekstualnih datoteka se može
pregledati bilo kojim editorom teksta.
Znakovni prenos kod binarnih datoteka
Za direktan upis u binarne datoteke, bez ikakvog posrednog formatiranja, takođe se mogukoristiti funkcije putc() i fgetc() ali
se tada ne vredi da se vrednost EOF (-1) koristi za dojavu greške, jer je kod binarnih datoteka to regularni simbol.
Za detektovanje kraja datoteke predviđena je posebna funkcija
int feof(FILE *fp); koja vraća vrednost različitu od nule ako je dosegnut kraj datoteke. Nakon toga više nije
moguće čitanje iz datoteke.
Primer: kopiranje iz jedne datoteke u drugu
#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE *fpi, *fpo;
if ((fpi = fopen( "prva", "rb" )) == NULL ) /* Otvori datoteku za čitanje u binarnom modu */
printf("greska");
if (( fpo = fopen( "druga", "wb" )) == NULL ) /* Otvori datoteku za pisanje u binarnom modu */
printf("greska");
while (1)
/* Učitaj 1 bajt iz fpi. Ako nije eof, upiši bajt u fpo */
{
char c = fgetc( fpi );
if ( !feof( fpi ) )
fputc( c, fpo );
else
break;
}
fclose ( fpi);
fclose ( fpo);
return 0;
}
Pozicioniranje na mesto u datoteci dat čija je udaljenost pomeraj bajtova od označene
reperne tačke data je funkcijom:
int fseek(FILE*dat, long pomeraj, int reper);
Moguće reperne tačke obeležavaju se sibmoličkim konstantama
SEEK_SET (početak datoteke),
SEEK_CUR (trenutna pozicija u datoteci) ili
SEEK_END (kraj datoteke).
Sledeće čitanje ili pisanjevršiće se počevši od ovako odabrane pozicije u datoteci.
Funkcija za pozicioniranje na početak datoteke data je:
void rewind(FILE *dat);
1
Direktni ulaz/izlaz za memorijske objekte
Najefikasniji i najbrži način pohrane bilo kojeg složenog memorijskog objekta je da se zapisuje u binarne datoteke. Na taj
način datoteka sadrži sliku memorijskog objekta, pa se isti može na najbrži mogući način preneti iz datoteke u memoriju.
Za ovakvi tip ulazno izlaznih operacija predviđene su dvije funkcije:
fwrite() i fread().
fwrite
Funkcija fwrite() služi za zapis u datoteku proizvoljnog broja bajta s neke memorijske lokacije. Prototip funkcije je:
int fwrite(void *buf, int size, int count, FILE *fp);
Argument buf je pokazivač na memorijsku lokaciju s koje se podaci zapisuju u tok fp.
Argument size označava veličinu u bajtima pojedinog elementa koji se upisuje.
Argumentcount označava ukupni broj takovih elemenata koji se zapisuju.
Funkcija vraća vrednost koja je jednaka broju elemenata koji su uspješno zapisani. Ako je tavrednost različita od count, to
znači da je nastala greška.
Npr. zapis skalarne varijable x, koja je tipa float, vrši se sa:
fwrite(&x, sizeof(float), 1, fp);
1.Npr. zapis skalarne varijable x, koja je tipa integer, vrši se sa:
fwrite(&x, sizeof(int), 1, fp); ili fwrite(&x, 4, 1, fp);
tip int je veličine 4 bajta
2. Npr. zapis niza od 50 elemenata strukturnog tipa, primjerice
struct tacka
{int x,
int y;}
niz[50];
vrši se iskazom:
fwrite(niz, sizeof(struct tacka), 50, fp); ili
fwrite(niz, sizeof(niz), 1, fp);
U drugom slučaju čitav se niz tretira kao jedan element, a učinak je isti kao u prvom iskazu.
fread
Funkcija fread() služi za učitavanje proizvoljnog broja bajta na neku memorijsku
lokaciju. Prototip funkcije je:
int fread(void *buf, int size, int count, FILE *fp);
Argument buf je pokazivač na memorijsku lokaciju u koju se upisuju podaci iz toka fp.
Argument size označava veličinu u bajtima pojedinog elementa koji se učitava.
Argument count označava ukupni broj takovih elemenata koji se učitavaju u memoriju.
Funkcija vraća vrednost koja je jednaka broju elemenata koji su uspešno učitani. Ako je ta vrednost različita od count, to znači
da je nastala greška ili je dosegnut kraj datoteke.
Prednost zapisa u binarnom modu u odnosu na formatirani zapis nije samu u
efikasnom korištenju resursa i brzini rada. U binarnom modu nema gubitka
informacije (smanjenja točnosti numeričkih zapisa) koje se javljaju u formatiranom
zapisu.
Nije preporučljivo direktno zapisivanje u datoteku struktura koji sadrže
pokazivačke članove, jer pri ponovnom učitavanju takovih struktura pokazivači
neće sadržavati ispravne adrese.
2
1.1.Kreiranje i unos nepoznatog broja brojeva u binarnu
dat
#include<stdio.h>
#include<stdlib.h>
int main ()
{
FILE *pok;
int broj;
char odluka;
pok=fopen("brojevi.dat","a+b");
if (pok==NULL)
printf("greska");
do
//Unos podataka u datoteku
{
printf("novi broj:");
scanf("%d",&broj);
fwrite(&broj,sizeof(int),1,pok);
printf("jos unosa? d/n: ");fflush(stdin);
scanf("%c",&odluka);
} while(odluka!='n' && odluka!='N');
fclose(pok);
return 0;
}
1.2 Unos n brojeva u bin dat
#include<stdio.h>
#include<stdlib.h>
int main ()
{
FILE *pok;
int broj;
int i,n;
printf("Koliko brojeva unosite?");
scanf("%d",&n);
pok=fopen("brojevi.dat","w+b");
if (pok==NULL)
printf("greska");
for(i=0;i<n;i++)
//Unos podataka u datoteku
{
printf("novi broj:");
scanf("%d",&broj);
fwrite(&broj,sizeof(int),1,pok);
}
fclose(pok);
return 0;
}
2.1 Ispis binarne dat na monitoru
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
int main ()
{ FILE *pok;
int broj;
pok=fopen("brojevi.dat","r+b");
//pok=fopen("D:/OOO/2/brojevi.dat","r+b");
while(fread(&broj,sizeof(int),1,pok)!=NULL)
// ili while(fread(&broj,4,1,pok)!=NULL)
printf("%d\n",broj);
fclose(pok);
getch();
return 0;
}
2.2 IInačin
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
int main ()
{ FILE *pok;
int broj;
pok=fopen("brojevi.dat","r+b");
//Citanje brojeva iz datoteke
while (1)
{ fread(&broj,sizeof(int),1,pok);
if ( !feof( pok ) )printf("%d\n",broj);
else break;
}
getch();
return 0;
}
3
3. Program koji kreira binarnu datoteku celih brojeva u kojoj se nalazi dužina niza n i niz celih brojeva
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
int main ()
{
FILE *pokdat;
int niz[20],n,i;
pokdat=fopen("nizbrojeva.dat","w+b");
if (pokdat==NULL)
printf("greska");
printf("Koliko ima elemenata u nizu? n= ");
scanf("%d",&n);
//unosi se duzina niza u datoteku
fwrite(&n,sizeof(int),1,pokdat);
printf("Unesite %d elemenata niza:\n",n); //potom se unose elementi niza
for(i=0;i<n;i++)
scanf("%d",&niz[i]);
fwrite(niz,sizeof(int),n,pokdat);
//upis celog niza odjednom
fclose(pokdat);
return 0;
}
4.Ispisuje niz iz datoteke (prvi podatak je dužina niza, a zatim elementi niza)
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
void main (void)
{
FILE *pokdat;
int niz[20],n,i;
pokdat=fopen("nizbrojeva.dat","r+b");
fread(&n,sizeof(int),1,pokdat); //Citanje brojeva iz datoteke
fread(&niz,sizeof(int),n,pokdat); //čitanje celog niza
for (i=0;i<n;i++)
printf("niz[%d]=%d\n",i,niz[i]);;
fclose(pokdat);
getch();
}
4
5.Program koji kreira binarnu datoteku sa slogovnim zapisom
#include<stdio.h>
#include<conio.h>
typedef struct
{
char ime[10];
char reg[10];
}Slog;
int main ()
{ FILE *dat;
Slog osoba;
char odluka;
dat=fopen("auto.dat","a+b");
//ako se stavi w, svaki sledeci put ce prebrisati datoteku!
if (dat==NULL)
printf("greska");
do
//Unos podataka u datoteku
{
printf("vlasnik:");
fflush(stdin);
gets(osoba.ime);
printf("registracija:");
gets(osoba.reg);
fwrite(&osoba,sizeof osoba,1,dat);
printf("jos unosa? d/n: ");
scanf("%c",&odluka);
} while(odluka!='n' && odluka!='N');
fclose(dat);
return 0; }
6.1Ispis na monitor sadržaja binarne datoteke slogovnog
6.2 Ispis na monitor sadržaja binarne datoteke slogovnog
tipa – I način
tipa – II način
#include<stdio.h>
#include<conio.h>
typedef struct
{
char ime[10];
char reg[10];
}Slog;
int main ()
{
FILE *dat;
Slog osoba;
dat=fopen("auto.dat","r+b");
//Citanje podataka iz datoteke
while(fread(&osoba,sizeof(osoba),1,dat)!=NULL)
{ printf("vlasnik: %s ",osoba.ime);
printf("registracija: %s\n",osoba.reg);
}
fclose(dat);
return 0;}
#include<stdio.h>
#include<conio.h>
typedef struct
{
char ime[10];
char reg[10];
}Slog;
int main ()
{
FILE *dat;
Slog osoba;
dat=fopen("auto.dat","r+b"); //Citanje podataka iz datoteke
while (1)
{ fread(&osoba,sizeof osoba,1,dat);
if ( !feof( dat ) ) printf("vlasnik: %s ",osoba.ime);
if ( !feof( dat ) ) printf("registracija: %s\n",osoba.reg);
else break;
}
fclose(dat);
return 0;}
5
Download

BINARNE DATOTEKE