You are on page 1of 37

Veleuilite u Rijeci

C++
mr. sc. Jasminka Tomljanovi, vii predava

Veleuilite u Rijeci

Sadraj
Datoteke

mr.11/12/16
sc.Jasminka Tomljanovi, vii predava

Veleuilite u Rijeci

Ulazno izlazna klasa datoteke


fstream

Definira f-je za itanje i upisivanje u


datoteku

ifstream za ulazne datoteke


ofstream za izlazne datoteke
Unutar klase fstream deklariraju se
datoteni objekti koji sadre sve potrebne
podatke i postupke za rad sa stvarnom
datotekom na disku
npr:
fstream d; //d je datoteni objekt
iz klase
// fstream kojemu
3
mr.11/12/16
sc.Jasminka Tomljanovi, vii predava
nije jo

Veleuilite u Rijeci

Stvarno ime datoteke je ime pod kojim je


datoteka vidljiva na disku preko
operacijskog sustava
Stvarno ime datoteke pridruuje se
datotenom objektu kod otvaranja
datoteke funkcijom open
<datoteni objekt>.open (<stvarno ime
dat>,<mod otvaranja>)

Mod otvaranja datoteke definira dozvoljene


4
mr.11/12/16
sc.Jasminka Tomljanovi, vii predava
operacije nad datotekom

Veleuilite u Rijeci

d.open(prva.dat,ios::in|ios::binary)
Datotenom objektu d pridruena je
stvarna datoteka prva .dat
Datoteka je otvorena za itanje u
binarnom nainu

mr.11/12/16
sc.Jasminka Tomljanovi, vii predava

Veleuilite u Rijeci

Datoteni pokaziva
datoteni pokaziva sadri poziciju unutar
datoteke gdje se moe obaviti operacija itanja
ili upisa u datoteku
pozicija je izraena u cijelom broju bajtova od
poetka datoteke do mjesta upisa/itanja
C++ razlikuje datoteni pokaziva za itanje
datoteke od datotenog pokazivaa za upis u
datoteku
Funkcije za oitavanje vrijednosti datotenog
pokazivaa (tipa tell):
tellg() - vrijednost pokazivaa za itanje
datoteke
tellp() - vrijednost pokazivaa za upis u
6
datoteku
mr.11/12/16
sc.Jasminka
Tomljanovi, vii predava

Veleuilite u Rijeci

Primjer 1:
d.open (prva.dat", ios::in);
//otvaranje datoteke za itanje
cout << d.tellg() << endl;
//0 -vrijednost dat. pokazivaa za
itanje

mr.11/12/16
sc.Jasminka Tomljanovi, vii predava

Veleuilite u Rijeci

Npr.:
d.open ("d.dat", ios::out);
//otvaranje dat. za upis podataka
cout << d.tellp() << endl;
//0 -vrijednost dat. pokazivaa za upis
otvaranjem datoteke u modu out
datoteni pokaziva za upis postavlja
se na poetak datoteke.
mr.11/12/16
sc.Jasminka Tomljanovi, vii predava

Veleuilite u Rijeci

Funkcije za zadavanje vrijednosti


datotenog pokazivaa (tipa seek):
seekg() - postavlja vrijednost
pokazivaa za
itanje datoteke
seekp() - postavlja vrijednost
pokazivaa za
upis u datoteku
Sintaksa:
mr. sc.Jasminka Tomljanovi, vii predava
11/12/16

Veleuilite u Rijeci

Npr.:
d.open ("d.dat", ios::in);
// otvaranje datoteke za itanje
d.seekg (5* sizeof(slog));
// postavlja datoteni pokaziva za
itanje
// na slog s rednim brojem 5
datoteni pokaziva za itanje postavlja
se na poziciju sloga s rednim brojem 5
mr.11/12/16
sc.Jasminka Tomljanovi, vii predava

10

Veleuilite u Rijeci

Modovi otvaranja datoteke


Definiraju dozvoljen nain rada s
datotekama (za itanje ili upis podataka),
poetnu poziciju datotenih pokazivaa
za itanje i upis, da li e se koristiti
postojea datoteka ili otvoriti nova
Zadaje se kao drugi argument f-je open
Ukljuenje vie modova otvaranja
datoteke postie se koritenjem bitovnog
ili operatora |
npr.:
mr.11/12/16
sc.Jasminka Tomljanovi, vii predava

11

Veleuilite u Rijeci

Mod in
koristi se za otvaranje datoteke za
itanje
otvara
postojeu
datoteku,
a
datoteni pokaziva za itanje se
postavlja na 0 (poetak datoteke)
ako datoteka sa zadanim stvarnim
imenom
ne
postoji
na
disku,
otvaranje ne uspijeva, to se moe
provjeriti
stanjem
datotenog
objekta:

mr.11/12/16
sc.Jasminka Tomljanovi, vii predava

12

Veleuilite u Rijeci

d.open(prva.dat",ios::in);
if (!d)
cout << "Otvaranje nije uspjelo,
datoteka ne postoji na disku!" << endl;
else
cout << "Datoteka je otvorena!" <<
endl;

mr.11/12/16
sc.Jasminka Tomljanovi, vii predava

13

Veleuilite u Rijeci

Mod out
koristi se za otvaranje datoteke za upis
podataka
datoteni pokaziva za upis se postavlja na 0
(poetak datoteke)
stvara se nova datoteka na disku ili se
postojea brie

moe se kombinirati s nocreate:


d.open(prva.dat",ios::out
|
ios::nocreate);
//ne dozvoljava brisanje postojee
datoteke
mr. sc.Jasminka
Tomljanovi, vii predava
11/12/16

14

Veleuilite u Rijeci

Mod noreplace
Datoteka nee biti otvorena , ako ve
postoji na disku:
d.open(prva.dat",ios::out
ios::noreplace);

mr.11/12/16
sc.Jasminka Tomljanovi, vii predava

15

Veleuilite u Rijeci

kombiniranjem modove in i out


otvaramo
datoteku kao ulazno-izlaznu:
d.open(prva.dat",ios::in
|
ios::out);
Otvara se postojea datoteka koju je
mogue neovisno itati i u nju
upisivati podatke, budui da su
razdvojeni datoteni pokazivai za
mr. sc.Jasminka Tomljanovi, vii predava
itanje i upis
11/12/16

16

Veleuilite u Rijeci

Mod trunc
brie sadraj postojee datoteke:

d.open(prva.dat",ios::out
ios::trunc);

otvara se postojea datoteka i brie


se njen sadraj, kako bi upis poeo u
praznoj datoteci
mr.11/12/16
sc.Jasminka Tomljanovi, vii predava

17

Veleuilite u Rijeci

Mod app (append)


otvara postojeu datoteku za upis
podataka, ali na kraj postojee
datoteke, za razliku od moda out.
datoteni pokaziva za upis sloga
svejedno dobiva vrijednost 0, radi
zatite postojeeg sadraja datoteke
od promjene sadraja

d.open(prva.dat",ios::app);
// otvara datoteku za dodavanje novih
mr. sc.Jasminka Tomljanovi, vii predava
zapisa
11/12/16

18

Veleuilite u Rijeci

Mod ate (at-end)


Otvara postojeu datoteku tako da se
datoteni pokaziva pozicionira na kraj
datoteke i to je pozicija prvog slijedeeg
sloga za upis u datoteku. Time nije
sprijeena naknadna promjena postojeeg
sadraja datoteke, kao kod moda app:
d.open(prva.dat",ios::out|ios::in|
ios::ate);
// otvara datoteku za dodavanje novih zapisa
Najee
se mod ate kombinira s
modovima in i out, radi upisa zapisa na
19
kraj
postojee
datoteke, uz mogunost
mr.11/12/16
sc.Jasminka
Tomljanovi,
vii predava

Veleuilite u Rijeci

Mod binary
otvara datoteku u binarnom nainu rada
nema
konverzija
kod
upisa/itanja
podataka kao kod tekstualnog naina
rada
(bitovni
sadraj
ostaje
nepromijenjen)
dat.open
("datoteka.dat",ios::in|
ios::binary);
//otvara ulaznu datoteku u binarnom modu
Binarni nain rada koristi se kod datoteka s
fiksnom veliinom sloga jer bi svaka
20
eventualna
mogla sadraj zapisa
mr.11/12/16
sc.Jasminka
Tomljanovi, viikonverzija
predava

Veleuilite u Rijeci

Tekstualna datoteka
Tekstualne datoteke sastoje se od podataka
znakovnog tipa (redova teksta)
svaki red zavrava kontrolnim znakovima
CR (Carriage Return; ASCII kod 13; prebacuje
kursor na poetak reda) i
LF (Line Feed; ASCII kod 10; pomie kursor u
slijedei red)
zajedno, CR i LF ine znak EOLN - znak za kraj
reda

da bi proitali/upisali neki podatak,


moramo najprije proitati/upisati sve
prethodne
21
mr.11/12/16
sc.Jasminka
Tomljanovi, vii predava

Veleuilite u Rijeci

Upis u tekstualnu datoteku


postie se jednostavnim umetanjem
teksta u datoteni tok pridruen
datotenom objektu i analogan je
odgovarajuem
konzolnom
ispisu
teksta pomou objekta cout.

mr.11/12/16
sc.Jasminka Tomljanovi, vii predava

22

Veleuilite u Rijeci

#include "stdafx.h"
#include <iostream>
#include <fstream>
using namespace std;
void main(){
fstream d;
d.open("C:\\DATOTEKE\\tekst.txt",ios::out);
d<< "Ovo je prvi red teksta u tekstualno
datoteci." << endl;
d << "Ovo je drugi red." << endl;
int a = 13;
d << a << endl;
d.close();
23
mr.11/12/16
}sc.Jasminka Tomljanovi, vii predava

Veleuilite u Rijeci

itanje tekstualne datoteke


postie se pomou metode getline
datotenog objekta. Sadraj se uitava
u znakovni niz, koji predstavlja redak iz
tekstualne datoteke.

mr.11/12/16
sc.Jasminka Tomljanovi, vii predava

24

#include "stdafx.h"
#include <iostream>
#include <fstream>
using namespace std;
void main(){
char red[80];
fstream d;
d.open("C:\\DATOTEKE\\tekst.txt",ios::in);
while(d){
d.getline (red,sizeof(red),'\n'); //itanje reda i
datoteke
cout << red << endl; // ispis na ekran
};
d.close();
25
mr.11/12/16
sc.Jasminka Tomljanovi, vii predava
Veleuilite u Rijeci

Veleuilite u Rijeci

Ovo je prvi red teksta u tekstualnoj


datoteci.
Ovo je drugi red.
13
Press any key to continue . . .

mr.11/12/16
sc.Jasminka Tomljanovi, vii predava

26

Veleuilite u Rijeci

znakovni varijabla red koristi se za


uitavanje pojedinih zapisa (redaka
teksta) iz tekstualne datoteke, koji su
meusobno odvojeni znakom <eoln>
za itanje tekstualne datoteke koristi se
funkcija
getline,
s
ulaznim
argumentima:
Znakovnim nizom koji se uitava
veliinom znakovnog niza koji se
uitava i
znakom
za
oznaku
kraja
reda
"\n
mr. sc.Jasminka Tomljanovi, vii predava
11/12/16

27

Veleuilite u Rijeci

Kontrola kraja datoteke postie se


pomou funkcije eof. Funkcija eof
vraa vrijednost logike istine tek kad
itanje zapisa iz datoteke ne
uspije. Zato je kontrola kraja datoteke
smjetena neposredno iza itanja
datoteke pomou funkcije getline.

mr.11/12/16
sc.Jasminka Tomljanovi, vii predava

28

Veleuilite u Rijeci

Datoteke s fiksnom veliinom sloga


Svi zapisi su istog tipa pa se jo zovu i
tipizirane datoteke
Potrebno je deklarirati tip zapisa
pomou struct
Npr.: struct student{
int mat_br,g_upisa;
char prez_ime[35];
};
mr.11/12/16
sc.Jasminka Tomljanovi, vii predava

29

Veleuilite u Rijeci

itanje datoteke sa slogovima

student s; //varijabla koja e se itati/upisivati


datoteku
fstream d; // datoteni objekt
d.open(studenti.dat",ios::in|
ios::binary);//otvara datoteku
// z
itanje
d.read ((char*)&s,sizeof(s)); // itanje podatak
iz datoteke
podatak s se ita iz datoteke pomou f-je read
30
mr.11/12/16
sc.Jasminka Tomljanovi, vii predava
nakon proitanog podatka datoteni pokaziva

Veleuilite u Rijeci

Upisivanje slogova u datoteku


slogova
char* - predstavlja operator dodjele tipa
jer f-ja read
definira prvi argument kao
argument tipa char*
sizeof(s) veliina sloga s izraena u
bajtovima
Podatak s se upisuje u datoteku pomou f-je

write
d.open
(studenti.dat",
mr.11/12/16
sc.Jasminka Tomljanovi, vii predava
ios::binary); //otvaranje

ios::out

31

Veleuilite u Rijeci

#include "stdafx.h"
#include <iostream>
#include <fstream>
using namespace std;
struct student
// tip zapisa koje sadri
datoteka
{
unsigned long int mat_br;
int g_upisa;
char prez_ime[35];
};
mr.11/12/16
sc.Jasminka Tomljanovi, vii predava

32

Veleuilite u Rijeci

student s;
// varijabla iji se sadraj upisuje /ita
u/iz datoteke
fstream datoteka;
// datoteni objekt
char naziv_datoteke[40];
// fiziko ime datoteke
void kreiranje_datoteke()
{
cout<<"Unesite naziv datoteke u koju cete spremati
podatke: ";
cin>>naziv_datoteke;
datoteka.open(naziv_datoteke, ios::out | ios::binary);
if (!datoteka)
// ako datoteka ne postoji na
disku obavjest o tome
cout<<"Neuspjesno otvaranje datoteke!";
else
mr.11/12/16
sc.Jasminka
Tomljanovi, vii predava
datoteka.close
();
// u protivnom zatvaram 33

void unos_podataka_u_datoteku
Veleuilite
u Rijeci

()

char dalje = 'n';


datoteka.open(naziv_datoteke, ios::out | ios::ate | ios::binary); // otvori datot
za pisanje,
//dodavanje na kra
binarnom modu
cout<<"\n\nUpisite podatke: \n\n ";
do {
cout<<endl;
// unos vrijednosti
cout<<"Maticni broj:"<<"\t"; cin>>s.mat_br;
cin.ignore();
do{
cout<<"Prezime i ime:"<<"\t";
cin.getline(s.prez_ime, 35);
} while (strlen(s.prez_ime) <= 1); // jednostavna petlja kojom
sprjeavamo unos praznog imena
cout<<"Godina upisa:"<<"\t"; cin>>s.g_upisa;
datoteka.write((char *)&s, sizeof(s)); // zapis u datoteku
cout<<"\nDalje (d/n)? ";
cin>>dalje;
mr.11/12/16
sc.Jasminka
Tomljanovi,
vii predava
}while (dalje
== 'd');

34

Veleuilite u Rijeci

void ispis_podataka_o_svim_studentima ()
{
datoteka.open(naziv_datoteke, ios::in | ios::binary);
cout<<endl<<"Ispis svih podataka"<<endl;
cout<<"----------------------------------------------"<<endl;
do
{
datoteka.read((char *)&s, sizeof (s)); // proitaj slog iz
datoteke
if(datoteka.eof()) break;
// ako je u itanju dolo do kraja
datoteke, prekini
cout<<"Maticni broj:"<<"\t"<<s.mat_br<<endl;
cout<<"Prezime i ime:"<<"\t"<<s.prez_ime<<endl;
cout<<"Godina upisa:"<<"\t"<<s.g_upisa<<endl;
cout<<"----"<<endl;
} while (!datoteka.eof());
datoteka.close ();

mr.11/12/16
sc.Jasminka Tomljanovi, vii predava

35

Veleuilite u Rijeci

void main()
{
kreiranje_datoteke ();
unos_podataka_u_datoteku ();
ispis_podataka_o_svim_studentima
();
}
mr.11/12/16
sc.Jasminka Tomljanovi, vii predava

36

Veleuilite u Rijeci
Unesite naziv datoteke u koju cete spremati podatke: C:\DATOTEKE\studenti.ini
Upisite podatke:
Maticni broj: 1
Prezime i ime: Ivo Ivic
Godina upisa: 2006
Dalje (d/n)? d
Maticni broj: 5
Prezime i ime: Ana Anic
Godina upisa: 2007
Dalje (d/n)? n
Ispis svih podataka
---------------------------------------------Maticni broj: 1
Prezime i ime: Ivo Ivic
Godina upisa: 2006
---Maticni broj: 5
Prezime i ime: Ana Anic
Godina upisa: 2007
---any keyTomljanovi,
to continuevii
. . .predava
mr.Press
11/12/1
sc.Jasminka

37

You might also like