You are on page 1of 34

Objektno-orijentisano

programiranje

1. Ulaz / Izlaz
Ulaz / Izlaz
 Ulaz i izlaz podataka –komunikacija programa sa
spoljnim svetom
 Ulaz –unos podataka preko ulaznih uređaja ili čitanje iz memorije
 Izlaz – prikaz podataka na izlaznim uređajima ili smeštanje u
memoriju

 Memorija u koju se podaci smeštaju može biti trajna ili


privremena
 trajna memorija –magnetni diskovi, flashmemorija, ...

 privremena memorija –operativna memorija (RAM)


Ulaz / Izlaz u programskom jeziku C++

 Nasledje iz programskog jezika C


 Ne postoje naredbe za ulaz/ izlaz

 U programskom jeziku C
 Skup bibliotečih funkcija za rad sa ulazom i izlazom
(<stdio.h>)

 C++ :
 Skup bilbitečkih C funkcija (<stdio.h>)
 Biblioteka klasa za objektno-orijentisanu realizaciju
ulaza i izlaza (efikasniji način)
Koncept tokova podataka
 U C++ U/I podataka se obavlja preko tokova podataka
(stream)
 Tok je niz bajtova
 Postoji razlika (ali nije suštinska) između pojmova:
 datoteka - tok u trajnoj memoriji (npr. disku) ili na U/I uređaju
 string - tok u privremenoj (operativnoj) memoriji
 Većina radnji sa tokovima je ista,bez obzira gde su oni
smešteni
 Rad sa tokovima u jeziku C++ realizuje se
odgovarajućim klasama
 konkretni tokovi predstavljaju se pomoću primeraka tih klasa
 klase za tokove su deo stanadardne biblioteke
Bibliotečke klase za rad sa tokovima
 Prenos podataka (sa ili bez U/I konverzije) – klase
definisane u <iostream>
 ios – osnovna klasa za sve tokove (iz nje su izvedene sve ostale)
 ostream – samo za izlazne tokove
 istream – samo za ulazne tokove
 iostream – za ulazno/izlazne tokove

 Iz ovih klasa su izvedne klase za rad sa datotekama i


tokovima u OM
Bibliotečke klase za rad sa tokovima
 Za rad sa datotekama (tokovima na diskovima) -klase
definisane u <fstream>
 ofstream – samo za izlazne tokove
 ifstream – samo za ulazne tokove
 fstream – za ulazno/izlazne tokove

 Za rad sa stringovima (tokovima u OM) – klase


definisane u <sstream>
 ostringstream – samo za izlazne tokove
 istringstream – samo za ulazne tokove
 stringstream – za ulazno/izlaznetokove
Bibliotečke klase za ulaz-izlaz
ios

istream ostream

iostream

ifstream istringstream fstream stringstream ofstream ostringstream


Standardni tokovi
 Postoje 4 standardna toka (globalni statički objekti koji se
kreiraju prilikom startovanja svake C++ aplikacije) :
 cin – glavni (standardni) ulaz tipa istream.
 Predstavlja tastaturu (ukoliko se drugačije ne specificira)
 Koristi se za unos ulaznih podataka u program.
 cout – glavni (standardni) izlaz tipa ostream
 Predstavlja ekran,
 Koristi se za ispisivanje podataka koji čine rezultate izvršavanja
programa.
 cerr – standardni izlaz za poruke o greškama tipa ostream.
 Predstavlja ekran
 clog – standardni izlaz za zabeleške tipa ostream.
 Predstavlja ekran,
 Koristi se za “vođenje evidencije” o događajima za vreme izvršenja
programa.
Datoteke

 Datoteke se koriste za trajno uskladištavanje podataka


 najčešće na magnetnim diskovima
 može i na trakama, flash memoriji i drugim medijima
 datoteke su vidljive u fajl-sistemu operativnog sistema

 Datoteke mogu da se podele na:


 binarne – u njima se podaci čuvaju u istom obliku kao i u OM za
vreme izvršenja programa
 tekstualne – u nima se podac ičuvaju u obliku čitljivom za
čoveka (kao niz ASCII kodova)
Konstruktori klasa fstream, ifstream i
ofstream

 Podrazumevani konstruktori
fstream();
ofstream();
ifstream();
 rezultat je kreiranje objekta bez otvaranja datoteke
 ulazno-izlazne operacije nisu dozvoljene za taj objekat
dok se ne pozove funkcija za otvaranje datoteke
Konstruktori klasa fstream, ifstream i
ofstream

 Konstruktori za inicijalizaciju
fstream(const char*imedat, int režim=ios::in|ios::out);
ofstream(const char*imedat, int režim=ios::out);
ifstream(const char* imedat, int režim=ios::in);

 imedat - predstavlja naziv datoteke koja treba da se otvori u toku


inicijalizacije objekta u navedenom režimu
 režim (rada sa datotekom) - može da se označi jednom od simboličkih
konstanti ili njihovom kombinacijom
Režimi otvaranja datoteka

 U klasi ios definisane su konstante koje određuju 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

 Podrazumevano:
 ako se ne navodi ios::out , datoteka mora da postoji na disku
 bez ios::binary - tekstualna datoteka
 za izlaz (ios::out ) se podrazumeva ios::trunc,
 izuzev kad se navede i jedan od režima ios::ate ili ios::app
Primeri kreiranja objekata
fstream dat; // bez otvaranja
ifstream uldat ("podaci.txt"); // za čitanje
ofstream izldat ("podaci.dat", ios::app);
// za dopisivanje
Otvaranje i zatvaranje dototeka
 Metoda za otvaranje datoteke
void open (const char* imedat, int režim);
 metoda otvara datoteku imedat u navedenom režimu pridružujući je tekućem
objektu
 tip tekućeg objekta može da bude fstream, ofstream ili ifstream

 Metoda za zatvaranje datoteke


void close();
 metoda vrši zatvaranje datoteke koja je pridružena tekućem objektu
 posle zatvaranja datoteke, za isti objekat može da se otvori druga datoteka
 zatvaranje datoteke ne uništava objekat

 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
 Za čitanje iz tekstualnih tokova bez konveryije kotisti se metoda get.
 Postoji više prototipova ove funkcije. Najčešće korišćeni su:

 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

 istream &get(char& znak);


Uzima sledeći znak iz ulaznog toka i smešta ga u promenljivu znak
npr. cin.get(c)

 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
 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

 Za čitanje podataka iz tekstualnih tokova koristi


se operator ekstrakcije (>>).
 Operator >> je u klasi istream implementiran
za sve standardne C++ tipove podataka.
 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
 Metoda za upis karaktera u tekstualni tok:
ostream& put (char znak);

 Metoda za pražnjenje izlaznog bafera:


ostream& flush ();
 zahteva se da se isprazni bafer, tj. da se izvrši prenos
svih znakova u njemu u izlazni tok
 korisno je da se uradi kad se duže vremena ne
očekuje novi pristup posmatranom toku
Upis u tekstualne tokove sa
konverzijom
 Za upis u tekstualni tok sa konverzijom koristi
se operator umetanja (<<).
 Operator umetanja je u klasi ostream
implemeirrnan za sve standardne C++ tipove
podataka.
 Operator << radi i sa predefinisanim
manipulatorima (elementima koji menjaju
formatiranje, npr. endl);
cout << “Neki text" << endl;
Formatiranje izlaza

 Formatiranje izlaza se može vršiti:


 Korišćenjem predefinisanih manipulatora,
 Korišćenjem metoda.
Predefinisani manipulatori za
formatiranje izlaza
setw(n) Postavljanje širine izlaznog polja.

endl Umetanje znaka ‘\n’ u izlazni tok i pražnjenje


izlaznog toka.
ends Umetanje znaka ‘\0’ u izlazni tok.

dec Uključuje dekadnu konverziju pri upisu celobrojnih


podataka.
oct Uključuje oktalnu konverziju pri upisu celobrojnih
podataka.
hex Uključuje heksadekadnu konverziju pri upisu
celobrojnih podataka.
ws Izbacivanje blanoko znakova sa početka.

flush Pražnjenje izlaznog bafera.


Primer korišćenja predefinisanih
manipulatora

 Š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

 Metoda za postavljanje širine izlaznog polja:


int width (int širina);

 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

 Metoda za čitanje podataka iz binarnog toka


istream& read (char* niz, int broj);
 uzima broj bajtova iz ulaznog toka u niz
 broj prenetih bajtova može da bude manji od
traženog broja
Primeri korišćenja funkcije read

 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

 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

 Metoda za upis podataka u binarni tok


ostream& write (char* niz, int broj);
 prenosi broj bajtova iz niza u izlazni tok
 broj prenetih bajtova može da bude manji od
traženog broja
Pozicioniranje unutar binarnog toka

 Ukoliko ne zelimo da čitamo sve podatke redom


iz datoteke, ili ukoliko želimo da promenimo baš
ordedjeni podatak u datoteci, pre čitanja/upisa
treba se pozicionirati na željeni podatak.

 Metode za pozicioniranje u izlaznom toku:


Pozicioniranje unutar ulaznog
binarnog toka
 Metode za pozicioniranje u ulaznom toku:
 istream& seekg (long pozicija);
 Vrši pozicioniranje na bajt sa rednim projem pozicija.
 istream& seekg (long pomeraj, int reper);
 Vrši pomeranje za zadati pomeraj u odnosu na reper.
 Reper se definiše korišćenjem sledećih simboličkih
konstanti:
ios::beg – početak toka
ios::cur – trenutna pozicija u toku
ios::end – kraj toka
Pozicioniranje unutar izlaznog
binarnog toka
 Metode za pozicioniranje u ulaznom toku:
 ostream& seekp (long pozicija);
 ostream& seekp (long pomeraj, int reper);
Provera grešaka

1. Sam objekat toka se može korisiti kao logička


vrednost:
 true – tok je u ipravnom stanju
 false – desila se neka greška prilikom pristupa toku

Primer:
if ( is.read( (char*) &r, sizeof( Radnik )) )
cout << “Citanje je uspelo” << endl;
else
cout << “Citanje nije uspelo” << endl;
Provera grešaka

1. Metode za proveru ispravnosti toka:


 bool good ();
 Vraća true ukoliko je tok ispravan, prethodni pristup je bio uspešan,
sledeće čitanje može da bude uspešno
 bool eof ();
 Vraća true ukoliko se stiglo do kraja toka, prethodni pristup je bio
uspešan, sledeće čitanje neće uspeti
 bool fail ();
 Vraća true ukoliko je prethodni pristup bio uspešan i nijedan bajt nije
izgubljen, ali da naredni pristup neće biti uspešan
 bool bad ();
 Vraća true ukoliko je tok u neispravnom stanju, ne može ništa da se
predvidi o uspehu narednih pristupa toku

You might also like