Datoteke

Datoteka je skup podataka koji su snimljeni na neku formu trajne memorije(hard disk, CD-ROM, floppy disk, …). Datoteci se pristupa preko njenog imena ( filename), u čijem sastavu se obično nalazi ekstenzija (deo imena iza tačke), koja označava tip podataka u datotec. Postoje dve vrste datoteka: tekstualne i binarne. Tekstualne datoteke sadrže tekst, dok  binarne mogu sadržati i kompleksne vrste podataka, kao što su slike, izvršni programi, baze podataka, itd. Tekstualnim datotekama je nešto jednostavnije pristupiti, pisati podatke u njih, te čitati sa njih.

 Standardna biblioteka-fstream

Standardna biblioteka fstream (f se odnosi na datoteku, tj. file), koja omogučava pisanje na i čitanje sa datoteka. Ovo se postiže pozivanjem sadržaja fstream
sa:
#include <fstream>
Datoteka fstream definiše tri nova tipa podataka:
  • ofstream –  Ovaj tip podataka predstavlja stream za izlazne datoteke (of odnosi se na output). Pravac izlaza je sa programa na datoteku. Ovaj tip podataka se koristi za kreiranje datoteka i pisanje informacija na njih. Ne može se koristiti za čitanje datoteka.
  • ifstream . Ovaj tip podataka predstavlja stream za ulazne datoteke (i odnosi se na input ). Pravac ulaza je sa datoteke prema programu. Ovaj tip podataka se koristi za čitanje informacija sa datoteka. Ne može se koristiti za kreiranje datoteka i pisanje u njih.
  • fstream . Ovaj tip podataka predstavlja stream za datoteke, ima karateristike i ofstream i ifstream . On može kreirati datoteke, pisati na njih i čitati sa njih

Pristup datotekama

Kada program pristupa datotekama, bez obzira da li ih čita, ili u njih upisuje, ili oboje, prolazi kroz sledeće korake:

  • Datoteka prvo mora da se otvori. Ovo otvara put u komunikaciji između datoteke i  stream objekta u programu (fstream ,ifstream, ofstream), koji se koristi u pristupu datoteci.
  •  Nakon otvaranja program čita sa datoteke, piše na nju, ili čini oboje.
  •  Na kraju, program zatvara datoteku. Ovo je bitan korak, pošto održavanje komunikacije između datoteke i stream objekta zahteva resurse, tako da zatvaranje datoteke oslobađa ove resurse kada više nisu potrebni. Uz to, postoji mogučnost da se kasnije u programu nemože pristupiti datoteci ako nije zatvorena pre predhodnog pristupa.

Bez obzira da li se sadržaj datoteke treba pročitati ili se u datoteci  treba upisati neki podaci, datoteka prvo treba da se otvori.

Otvaranje datoteke za pisanje

Datoteke sa pisanje se mogu otvoriti pomoću fstream ofstream objekata na dva načina:
(i) pomoću metode (member function ) open, ili
(ii) pomoću konstruktora (constructor ).

Otvaranje pomoću funkcije open

Prvi argument funkcije open je ime i lokacija datoteke koja se treba otvoriti. Međutim, moguće je dodati i drugi argument zavisno od toga da li se fstream i ofstream poziva funkcijom  open , ili se želi neki drugi modul od onog koji se daje. Datoteka u koju želimo upisivati podatke ne mora postojati. U slučaju da ne postoji, ona će se automatski kreirati pod imenom i na lokaciji koju smo upisali. Lokacija se može dati kao relativna( relative path) i apsolutna ( absolute path). Pri tome, relativni put predstavlja lokaciju u odnosu na naš program, tj. datoteka se stvara u direktorijumu  u kojem se nalazi i naš program. Ovo postižemo na sledeći način:
ofstream izlaz;
izlaz.open(„studenti.txt“);
Za razliku od relativnog puta, apsolutni put predstavlja lokaciju koja započinje slovom drajva,sadrže i sve direktorijume i poddirektorijume dok se ne dođe do datoteke. Na primer, ako je datoteka studenti.txt u direktoriumu Pedagoski , a ovaj je podirektorium direktoriuma MFZE , a sve se nalazi na tvrdom disku sa slovom C, onda bi se datoteka otvorila na sledeći način:
ofstream izlaz;
izlaz.open(„C:\\MFZE\\Pedagoski\\studenti.txt“);
Koriste se po dva znaka \\, jer samo jedan između navodnika predstavlja escape-sekvencu. Bez obzira da li koristimo relativni ili apsolutni put, argument za funkciju open ne mora da bude neko ime (reč), nego i (string ) varijabla.
pr:
ofstream izlaz;
char imeDatoteke[80];
cout << „Unesite ime datoteke: „;
cin >> imeDatoteke;
izlaz.open(imeDatoteke);
Važno je zapamtiti da je korištenje relativnog puta bolja opcija, jer se može desiti da neki direktorijum koji se navodi u  apsolutnoj putanji ne postoji, naročito ako se program koristi na nekom drugom raunaru (sa drugačijim direktorijima).
Korištenje drugog argumenta u funkciji open definiše modul u kojem se datoteka treba otvoriti.
Ako za otvaranje datoteke koristimo ofstream objekat, onda ne moramo koristiti dodatne argumente, ali treba zapamtiti da u tom slučaju možemo samo upisivati informaciju u datoteku, ali ne i čitati sa nje. Ako želimo, na primer, da pratimo greške izazvane pokretanjem nekog programa i sačuvamo  sve zapise o tome, koristilimo  opciju ios::app , tj.
ofstream izlaz;
izlaz.open(„studenti.txt“, ios::app);
Međutim, ako se za otvaranje datoteke za pisanje koristi fstream objekat, treba se dodati još jedan argument, tj. opcija za pisanje (ios::in). U ovom slučaju bi bilo:
fstream izaz;
izlaz.open(„studenti.txt“, ios::out)

Otvaranje pomoću konstruktora

Konstruktori su funkcije koje se automatski pozivaju kada se pokušava kreirati  instanca nekog objekta (instanca prema objektu je isto što i varijabla prema tipu podatka). Oni mogu biti opterećeni (overloaded ), tako da isti objekat može imati konstruktor sa nijednim, jednim, dva, il iviše argumenata. U prethodnim primerima (npr.fstream izlaz;) korištene su naredbe sa konstruktorima bez argumenata. Naredni primeri pokazuju upotrebu konstruktora sa jednim i dva argumenta, respektivno:

ofstream izaz(„studenti.txt“);
fstream izaz(„studenti.txt“,ios::out);
Primena konstruktora, u stvari, omogućava deklarisanje i inicijalizaciju primerka nekog objekta.Kao i u slučaju deklarisanja i inicijalizacije varijabli, korištenje jednog od načina otvaranja datoteke zavisi od samog programa i naših potreba.

Otvaranje datoteka za čitanje 

Sve što je rečeno može se primeniti i na otvaranje datoteka za čitanje. Jedina razlika je što se, uz korištenje objekta fstream, umjesto objekta ofstream koristi iostream objekat. Uz to, datoteka sa koje se čita mora postojati, jer se pokretanjem jednog od prethodnih objekata ne kreira datoteka.

Otvaranje datoteke za čitanje:

ifstream ulaz;
ulaz.open(„studenti.txt“);
fstream ulaz;
ulaz.open(„studenti.txt“, ios::in);//obavezno dodati argument ios::in
ifstream ulaz(„studenti.txt“);
fstream ulaz(„studenti.txt“, ios::in)
Otvaranje datoteka za čitanje i pisanje
Kao što je ranije rečeno, objekat fstream se može koristiti za otvaranje datoteka i za pisanje i za čitanje. U tu svrhu koristi se sledeča sintaksa:
fstream izlazUlaz;
izlazUlaz.open(„studenti.txt“, ios::in | ios::out);
ili pomoću konstruktora:
fstream izlazUlaz („studenti.txt“, ios::in | ios::out);
U oba primera korišten je tzv.bitwiseoperator (|), koji ima isto značenje kao logički operator ||(ili).

 Zatvaranje datoteka

 Svaka otvorena datoteka se treba zatvoriti pre nego se napusti program. To je zbog toga što svaka otvorena datoteka zahteva sistemske resurse. Osim toga, neki operativni sistemi imaju ograničen broj otvorenih datoteka kojima se ne ‘manipuliše’.Zatvranje datoteka se vrši pomoću funkcije close. Primeri pokazuju njenu upotrebu pri zatvaranju datoteka za pisanje i čitanje

ofstream izlaz;

izlaz.open(„studenti.txt“);
// skup naredbi 
outfile.close();
 ifstream ulaz;
ulaz.open(„studenti.txt“);
// skup naredbi
ulaz.close();

 

Upis  u datoteku

Pogledajte video film

Pisanje podataka na datoteku se izvodi pomoću operatora za ispisivanje (<< ), kao što je to bio slučaj sa ispisivanjem na ekran (cout <<). Jedina razlika je u tome što se ovde koristi fstream ili iostrem objekat, a ne cout objekat. Sledeći program pokazuje primer upisivanja podataka u datoteku studenti.txt:

#include <fstream>

#include <iostream>

using namespace std;

int main ()

{

char podaci[80];

ofstream izlaz;

izlaz.open(„studenti.txt“);

cout << „Zapisivanje u datoteku“ << endl;

cout << „=======================“ << endl;

cout << „Upisite razred: „;

cin.getline(podaci, 80);

izlaz << podaci << endl;

cout << „Unesite broj studenata: „;

cin >> podaci;

cin.ignore();

izlaz << podaci << endl;

izlaz.close();

return 0;} Upotrebom drugog argumenta pri otvaranju datoteke za pisanje ( ios::app) možemo dodavati sadržaj na postojeću datoteku kao što to pokazuje sl.  primer. U ovom primeru zapisivanje se prekida nakon unosa znakova ***.

#include <iostream>

#include <string>

#include <fstream>

using namespace std;

int main ()

{

string x;

ofstream izlaz;

izlaz.open(„podaci.txt“, ios::app);

while (x != „***“)

{

cout << „Unesite neki tekst (za kraj unesite ***):“ << endl;

cin >> x;

izlaz << x << endl;

}

izlaz.close();

}

Čitanje sa datoteka

Pogledajte video film

Čitanje podataka sa datoteka obavlja se pomoću operatora za čitanje (>>) kao što je to slučaj sa ispisivanjem sa tastature (cin>>). Sl. primer nadopunjava onaj iz prethodnog poglavlja, tj. nakon što korisnik upisuje informacije na datoteku, program čita iste podatke i ispisuje ih na ekran.

#include <fstream>

#include <iostream>

using namespace std;

int main ()

{

string podaci;

ofstream izlaz;

izlaz.open(„studenti.txt“);

cout << „Upisivanje u datoteku“ << endl;

cout << „=====================“ << endl;

cout << „Unesite razred: „;

getline(cin,podaci);

izlaz << podaci << endl;

cout << „Unesite broj studenata: „;

cin >> podaci;

cin.ignore();

izlaz << podaci << endl;

izlaz.close();

ifstream ulaz;

cout << „Citanje sa datoteke“ << endl;

cout << „===================“ << endl;

ulaz.open(„studenti.txt“);

getline(ulaz,podaci);

cout << podaci << endl;

getline(ulaz,podaci);

cout << podaci << endl;

ulaz.close();

return 0;

}

Međutim, vidimo da je u ovom slučaju korištena C++ string klasa umjesto varijable podaci tipa char. Na taj način se pomoću funkcije getline može ispisati ime razreda koje ima više od jedne reči. Prethodni primer se može napisati i na sl. način upotrebom funkcija za čitanje i pisanje na datoteku.
#include <fstream>
#include <iostream>
#include <string>
using namespace std;
bool upisiDatoteku (ofstream&, char*);
bool citajDatoteku (ifstream&, char*);
int main ()
{
string podaci;
bool status;
ofstream izlaz;
status = upisiDatoteku(izlaz, „studenti.txt“);
if (!status)
{
cout << „Datoteka za ispisivanje se ne mozeotvoriti\n“;
cout << „Program se zavrsava\n“;
system(„PAUSE“);

return 0;

}
else
{
cout << „Pisanje u datoteku“ << endl;
cout << „==================“ << endl;
cout << „Upisite razred: „
;getline(cin, podaci);
izlaz << podaci<< endl
;cout << „Unesite broj studenata: „;
cin >> podaci;
cin.ignore()
;izlaz << podaci<< endl;
izlaz.close();
}
ifstream ulaz;
status = citajDatoteku(ulaz, „studenti.txt“);
if (!status)
{
cout << „Datoteka za citanje se ne moze otvoriti\n“;
cout << „Program se zavrsava\n“;
system(„PAUSE“);
return 0;
}
else
{
cout << „Citanje se datoteke“ << endl;
cout << „===================“ << endl;
getline(ulaz, podaci);
while(!ulaz.fail())
{
cout << podaci << endl;
getline(ulaz, podaci);
}
ulaz.close();
}
system(„PAUSE“);
return 0;
}
bool upisiDatoteku (ofstream& datoteka, char* strDatoteka)
{
datoteka.open(strDatoteka);
if (datoteka.fail())
return false;
else return true;
}
bool citajDatoteku (ifstream& datoteka, char* strDatoteka)
{
datoteka.open(strDatoteka);
if (datoteka.fail())
return false;
else return true;
}
return 0;
}
else
{
cout << „Pisanje u datoteku“ << endl;
cout << „==================“ << endl;
cout << „Upisite razred: „;
getline(cin, podaci);
izlaz << podaci<< endl;
cout << „Unesite broj studenata: „;
cin >> podaci;
cin.ignore();izlaz << podaci<< endl;
izlaz.close();
}
ifstream ulaz;status = citajDatoteku(ulaz, „studenti.txt“);
if (!status)
{
cout << „Datoteka za citanje se ne moze otvoriti\n“;
cout << „Program se zavrsava\n“;
system(„PAUSE“);
return 0;
}
else
{
cout << „Citanje se datoteke“ << endl;
cout << „===================“ << endl;
getline(ulaz, podaci);
while(!ulaz.fail())
{
cout << podaci << endl;
getline(ulaz, podaci);
}
ulaz.close();
}
system(„PAUSE“);
return 0;
}
bool upisiDatoteku (ofstream& datoteka, char* strDatoteka)
{
datoteka.open(strDatoteka);
if (datoteka.fail())
return false;
else return true;}
bool citajDatoteku (ifstream& datoteka, char* strDatoteka)
{
datoteka.open(strDatoteka);
if (datoteka.fail())
return false;
else return true;
}

Ostavite odgovor

Popunite detalje ispod ili pritisnite na ikonicu da biste se prijavili:

WordPress.com logo

Komentarišete koristeći svoj WordPress.com nalog. Odjavi se /  Promeni )

Fejsbukova fotografija

Komentarišete koristeći svoj Facebook nalog. Odjavi se /  Promeni )

Povezivanje sa %s