You are on page 1of 34

Objektno-orijentisano

programiranje
1. Ulaz/ Izlaz
Ulaz / Izlaz
n Ulaz i izlaz podataka komunikacija programa sa
spoljnim svetom
q Ulaz unos podataka preko ulaznih ureaja ili !itanje iz memorije
q Izlaz prikaz podataka na izlaznim ureajima ili sme$tanje u
memoriju
n Memorija u koju se podaci sme$taju mo&e biti trajna ili
privremena
q trajna memorija magnetni diskovi, flashmemorija, ...
q privremena memorija operativna memorija (RAM)
Ulaz / Izlaz u programskom jeziku C++
n Nasledje iz programskog jezika C
q Ne postoje naredbe za ulaz/ izlaz
n U programskom jeziku C
q Skup bibliote!ih funkcija za rad sa ulazom i izlazom
(<stdio.h>)
n C++ :
q Skup bilbite!kih C funkcija (<stdio.h>)
q Biblioteka klasa za objektno-orijentisanu realizaciju
ulaza i izlaza (efikasniji na!in)
Koncept tokova podataka
n U C++ U/I podataka se obavlja preko tokova podataka
(stream)
q Tok je niz bajtova
n Postoji razlika (ali nije su$tinska) izmeu pojmova:
q datoteka - tok u trajnoj memoriji (npr. disku) ili na U/I ureaju
q string - tok u privremenoj (operativnoj) memoriji
n Ve(ina radnji sa tokovima je ista,bez obzira gde su oni
sme$teni
n Rad sa tokovima u jeziku C++ realizuje se
odgovaraju(im klasama
q konkretni tokovi predstavljaju se pomo(u primeraka tih klasa
q klase za tokove su deo stanadardne biblioteke
Bibliote!ke klase za rad sa tokovima
n Prenos podataka (sa ili bez U/I konverzije) klase
definisane u <iostream>
q ios osnovna klasa za sve tokove (iz nje su izvedene sve ostale)
q ostream samo za izlazne tokove
q istream samo za ulazne tokove
q iostream za ulazno/izlazne tokove
n Iz ovih klasa su izvedne klase za rad sa datotekama i
tokovima u OM
Bibliote!ke klase za rad sa tokovima
n Za rad sa datotekama (tokovima na diskovima) -klase
definisane u <fstream>
q ofstream samo za izlazne tokove
q ifstream samo za ulazne tokove
q fstream za ulazno/izlazne tokove
n Za rad sa stringovima (tokovima u OM) klase
definisane u <sstream>
q ostringstream samo za izlazne tokove
q istringstream samo za ulazne tokove
q stringstream za ulazno/izlaznetokove
Bibliote!ke klase za ulaz-izlaz
ios
istream ostream
iostream
ifstream istringstream fstream stringstream ofstream ostringstream
Standardni tokovi
n Postoje 4 standardna toka (globalni stati !ki objekti koji se
kreiraju prilikom startovanja svake C++ aplikacije) :
q cin glavni (standardni) ulaz tipa istream.
n Predstavlja tastaturu (ukoliko se druga!ije ne specificira)
n Koristi se za unos ulaznih podataka u program.
q cout glavni (standardni) izlaz tipa ostream
n Predstavlja ekran,
n Koristi se za ispisivanje podataka koji !ine rezultate izvr$avanja
programa.
q cerr standardni izlaz za poruke o gre$kama tipa ostream.
n Predstavlja ekran
q clog standardni izlaz za zabele$ke tipa ostream.
n Predstavlja ekran,
n Koristi se za voenje evidencije o dogaajima za vreme izvr$enja
programa.
Datoteke
n Datoteke se koriste za trajno uskladi$tavanje podataka
q naj!e$(e na magnetnim diskovima
q mo&e i na trakama, flash memoriji i drugim medijima
q datoteke su vidljive u fajl-sistemu operativnog sistema
n Datoteke mogu da se podele na:
q binarne u njima se podaci !uvaju u istom obliku kao i u OM za
vreme izvr$enja programa
q tekstualne u nima se podac i!uvaju u obliku !itljivom za
!oveka (kao niz ASCII kodova)
Konstruktori klasa fstream, ifstream i
ofstream
n Podrazumevani konstruktori
fstream();
ofstream();
ifstream();
q rezultat je kreiranje objekta bez otvaranja datoteke
q ulazno-izlazne operacije nisu dozvoljene za taj objekat
dok se ne pozove funkcija za otvaranje datoteke
Konstruktori klasa fstream, ifstream i
ofstream
n Konstruktori za inicijalizaciju
fstream(const char*imedat, int reim=ios::in|ios::out);
ofstream(const char*imedat, int reim=ios::out);
ifstream(const char* imedat, int reim=ios::in);
q imedat - predstavlja naziv datoteke koja treba da se otvori u toku
inicijalizacije objekta u navedenom re&imu
q reim (rada sa datotekom) - mo&e da se ozna!i jednom od simboli!kih
konstanti ili njihovom kombinacijom
Re&imi otvaranja datoteka
n U klasi ios definisane su konstante koje odreuju re&ime
otvaranja:
ios::in otvaranje datoteke za ulaz
ios::out otvaranje datoteke za izlaz
ios::ate pozicioniranje na kraj datoteke posle otvaranja
ios::app pozicioniranje na kraj datoteke pre svakog upisivanja
ios::binary binarna datoteka
ios::trunc uni$tavanje sadr&aja datoteke ukoliko postoji
n Podrazumevano:
q ako se ne navodi ios::out , datoteka mora da postoji na disku
q bez ios::binary - tekstualna datoteka
q za izlaz (ios::out ) se podrazumeva ios::trunc,
n izuzev kad se navede i jedan od re&ima ios::ate ili ios::app
Primeri kreiranja objekata
fstream dat; / / bez ot var anj a
ifstream uldat ("podaci.txt"); / / za i t anj e
ofstream izldat ("podaci.dat", ios::app);
/ / za dopi si vanj e
Otvaranje i zatvaranje dototeka
n Metoda za otvaranje datoteke
void open (const char* i medat , int r e#i m);
q metoda otvara datoteku imedat u navedenom re&imu pridru&uju(i je teku(em
objektu
q tip teku(eg objekta mo&e da bude fstream, ofstream ili ifstream
n Metoda za zatvaranje datoteke
void close();
q metoda vr$i zatvaranje datoteke koja je pridru&ena teku(em objektu
q posle zatvaranja datoteke, za isti objekat mo&e da se otvori druga datoteka
q zatvaranje datoteke ne uni $tava objekat
n Metoda za ispitivanje da li je datoteka korektno otvorena
bool is_open();
Primer otvaranja i zatvaranja dototeke
fstream dat;
dat.open( "podaci.dat", ios::in | ios::out );
dat.close();
*itanje iz tekstualnih tokova bez konverzije
n Za !itanje iz tekstualnih tokova bez konveryije kotisti se metoda get.
n Postoji vi$e prototipova ove funkcije. Naj!e$(e kori$(eni su:
q int get ();
Uzima slede(i znak iz ulaznog toka za koji je pozvana
Rezultat je kod pro!itanog znaka ili EOF ako se stiglo do kraja toka
q istream &get(char& znak);
Uzima slede(i znak iz ulaznog toka i sme$ta ga u promenljivu znak
npr. cin.get(c)
q istream &get(char* niz, int max);
*ita max broj znakova (ukoliko postoji toliko znakova) i sme$ta ih u
niz
npr. cin.get(ime, 20)
*itanje iz tekstualnih tokova bez konverzije
q istream &get(char* niz, int max, char kraj='\n');
istream &getline(char* niz, int max,
char kraj='\n');
*ita sve znakove do prvog pojavljivanja znaka kraj.
Mo&e da pro!ita najvi$e max broj znakova.
npr. cin.get(ime, 20, '\n')
Operacija getline je veoma sli!na operaciji get, jedino $to uklanja
znak prekida (npr. '\n'), dok get ne uklanja.
*itanje iz tekstualnih tokova sa konverzijom
n Za itanje podataka iz tekstualnih tokova koristi
se operator ekstrakcije (>>).
n Operator >>je u klasi istream implementiran
za sve standardne C++tipove podataka.
n Operator >>uzima znakove iz ulaznog toka do
pojave bilo kog belog simbola (blanko znaka,
tabulatora ili prelaza na novi red).
Upis u tekstualne datoteke bez
konverzije
n Metoda za upis karaktera u tekstualni tok:
ostream& put (char znak);
n Metoda za pra&njenje izlaznog bafera:
ostream& flush ();
q zahteva se da se isprazni bafer, tj. da se izvr$i prenos
svih znakova u njemu u izlazni tok
q korisno je da se uradi kad se du&e vremena ne
o!ekuje novi pristup posmatranom toku
Upis u tekstualne tokove sa
konverzijom
n Za upis u tekstualni tok sa konverzijom koristi
se operator umetanja (<<).
n Operator umetanja je u klasi ostream
implemeirrnan za sve standardne C++ tipove
podataka.
n Operator << radi i sa predefinisanim
manipulatorima (elementima koji menjaju
formatiranje, npr. endl);
cout << Neki text" << endl;
Formatiranje izlaza
n Formatiranje izlaza se mo#e vr%iti:
q Kori%'enjem predefinisanih manipulatora,
q Kori%'enjem metoda.
Predefinisani manipulatori za
formatiranje izlaza
Pra&njenje izlaznog bafera.
flush
Izbacivanje blanoko znakova sa po!etka.
ws
Uklju!uje heksadekadnu konverziju pri upisu
celobrojnih podataka.
hex
Uklju!uje oktalnu konverziju pri upisu celobrojnih
podataka.
oct
Uklju!uje dekadnu konverziju pri upisu celobrojnih
podataka.
dec
Umetanje znaka \0 u izlazni tok.
ends
Umetanje znaka \n u izlazni tok i pra&njenje
izlaznog toka.
endl
Postavljanje $irine izlaznog polja.
setw(n)
Primer kori$(enja predefinisanih
manipulatora
n ,tampanje podataka u 2 kolone:
double values[] = { 1.23, 35.36, 653.7, 4358.24 };
char *names[] = { "Zoot", "Jimmy", "Al", "Stan" };
for( int i = 0; i < 4; i++ )
cout << setw( 6 ) << names[i]<< setw( 10 ) <<
values[i] << endl;
Metode za formatiranje izlaza
n Metoda za postavljanje %irine izlaznog polja:
int width (int #irina);
n Metoda za postavljanje znaka kojim 'e se
popuniti izlazno polje ukoliko podatak nije
dovoljno dug:
char fill (char znak);
Primer kori%'enja metoda za
formatiranje ulaza
double values[] = { 1.23, 35.36, 653.7, 4358.24 };
for( int i = 0; i < 4; i++ )
{
cout.width( 10 );
cout.fill( '*' );
cout << values[i] << endl;
}
)itanje iz binarnih tokova
n Metoda za !itanje podataka iz binarnog toka
istream& read (char* niz, int broj);
q uzima broj bajtova iz ulaznog toka u niz
q broj prenetih bajtova mo&e da bude manji od
tra&enog broja
Primeri kori$(enja funkcije read
n Primer 1:
struct Radnik
{
char ime[20];
double plata;
} r;
ifstream is( datoteka.dat", ios::in |
ios::binary | ios::nocreate );
is.read( (char*) &r, sizof( Radnik ) );
Primeri kori$(enja funkcije read
n Primer 2:
int n, *niz;
ifstream is( datoteka.dat", ios::in |
ios::binary | ios::nocreate );
is.read( (char*) &n, sizof( int ) );
niz = new int[n];
is.read((char*) niz, n*sizof( int ) );
Upis u binarne tokove
n Metoda za upis podataka u binarni tok
ostream& write (char* niz, int broj);
q prenosi broj bajtova iz niza u izlazni tok
q broj prenetih bajtova mo&e da bude manji od
tra&enog broja
Pozicioniranje unutar binarnog toka
n Ukolikonezelimodaitamo sve podatke redom
iz datoteke, ili ukoliko #elimo da promenimo ba%
ordedjeni podatak u datoteci, pre itanja/upisa
treba se pozicionirati na #eljeni podatak.
n Metode za pozicioniranje u izlaznom toku:
Pozicioniranje unutar ulaznog
binarnog toka
n Metode za pozicioniranje u ulaznom toku:
q istream& seekg (long pozicija);
n Vr$i pozicioniranje na bajt sa rednim projem pozicija.
q istream& seekg (long pomeraj, int reper);
n Vr$i pomeranje za zadati pomeraj u odnosu na reper.
n Reper se defini$e kori$(enjem slede(ih simboli!kih
konstanti:
ios::beg poetak toka
ios::cur trenutna pozicija u toku
ios::end kraj toka
Pozicioniranje unutar izlaznog
binarnog toka
n Metode za pozicioniranje u ulaznom toku:
q istream& seekp (long pozicija);
q istream& seekp (long pomeraj, int reper);
Provera gre$aka
1. Sam objekat toka se mo&e korisiti kao logi!ka
vrednost:
n true tok je u ipravnom stanju
n false desila se neka gre$ka prilikom pristupa toku
Primer:
if ( is.read( (char*) &r, sizof( Radnik ) ) )
cout << Citanje je uspelo << endl;
else
cout << Citanje nije uspelo << endl;
Provera gre$aka
1. Metode za proveru ispravnosti toka:
q bool good ();
n Vra'atrue ukolikojetokispravan, prethodni pristupjebio uspe%an,
slede'eitanjemo#edabudeuspe%no
q bool eof ();
n Vra'atrue ukolikose stiglodo krajatoka, prethodni pristupjebio
uspe%an, slede'eitanjene'euspeti
q bool fail ();
n Vra'atrue ukolikojeprethodni pristupbio uspe%ani nijedanbajt nije
izgubljen, ali danaredni pristupne'ebiti uspe%an
q bool bad ();
n Vra'atrue ukolikojetoku neispravnomstanju, nemo#eni%tadase
predvidi o uspehunarednihpristupatoku

You might also like