Sunteți pe pagina 1din 40

6/30/2014

1
Cuvinte importante:
- Lucru cu directoare in limbajul C: schimbarea directorului
curent; crearea unui director; stergerea unui director; aflarea drive-ului
curent; aflarea directorului curent;
- Redirectarea intrarilor si iesirilor in limbajul C; redirectarea
intrarilor si iesirilor in limbajul C++;
- Fisiere in limbajul C++: Fluxurile de I/O din C++;
- Utilizarea manipulatorilor si indicatoarelor de formatare pentru
formatarea iesirilor si intrarilor in limbajul C++;
- Declararea fisierelor in C++; deschiderea fisierelor in C++;
inchiderea unui fisier deschis in limbajul C++;
- Citirea si scrierea datelor in fluxurile de fisiere;
- Determinarea pozitiei curente (pointerului de pozitie) dintr-un
flux de fisier; setarea pozitiei pointerului de pozitie dintr-un flux de fisier.
6/30/2014
2
Lucru cu directoare in limbajul C
Schimbarea directorului curent
Pentru schimbarea directorului curent, se poate folosi functia chdir(). Daca functia
chdir() se executa cu succes, ea returneaza valoarea 0. Daca directorul nu exista,
functia chdir() returneaza valoarea -1.
Functia este declarata astfel:
#include <dir.h>
int chdir(const char *cale_director);
unde: - parametrul cale_director - specifica numele complet (inclusiv calea) al noului
director curent.
Nota: Daca se apeleaza functia chdir() cu un sir de caractere care nu contine litera
unitatii de disc, ea va cauta directorul pe unitatea curenta.
De exemplu, urmatorul apel al functiei chdir() selecteaza directorul data de pe
unitatea curenta de disc:
int stare;
stare = chdir (\\data);
6/30/2014
3
Crearea unui director
Pentru crearea unui director, se poate folosi functia mkdir(). Daca functia mkdir()
se executa cu succes, ea returneaza valoarea 0. Daca nu se poate crea directorul,
functia mkdir() returneaza valoarea -1.
Functia este declarata astfel:
#include <dir.h>
int mkdir(const char *cale_director);
unde: - parametrul cale_director - specifica numele complet (inclusiv calea) al
directorului creat.
Nota: Daca se apeleaza functia mkdir() cu un sir de caractere care nu contine litera
unitatii de disc, ea va crea directorul pe unitatea curenta.
1. Urmatorul exemplu creaza directorul data pe unitatea curenta de disc:
int stare;
stare = mkdir (\\data);
2. Urmatorul exemplu creaza directorul datatemp pe unitatea curenta, in directorul
curent:
stare = mkdir (datatemp);
6/30/2014
4
Stergerea unui director
Pentru stergerea unui director, se poate folosi functia rmdir(). Daca functia rmdir()
se executa cu succes, ea returneaza valoarea 0. Daca directorul nu exista sau nu poate
fi sters, functia rmdir() returneaza valoarea -1.
Functia este declarata astfel:
#include <dir.h>
int rmdir(const char *cale_director);
unde: - parametrul cale_director - specifica numele complet (inclusiv calea) al
directorului de sters.
Nota: Daca se apeleaza functia rmdir() cu un sir de caractere care nu contine litera
unitatii de disc, ea va sterge directorul de pe unitatea curenta.
1. Urmatorul exemplu sterge directorul data de pe unitatea curenta de disc:
int stare;
stare = rmdir (\\data);
2. Urmatorul exemplu sterge directorul datatemp de pe unitatea curenta, din
directorul curent:
stare = rmdir (datatemp);
6/30/2014
5
Aflarea drive-ului curent
Pentru aflarea drive-ului curent, se poate folosi functia getdisk(). Functia getdisk()
returneaza un intreg care reprezinta numarul drive-ului curent si anume: 0 pentru A;
1 pentru B; 2 pentru C si asa mai departe.
Functia este declarata astfel:
#include <dir.h>
int getdisk(void);
Urmatorul exemplu, ilustreaza modul de folosire a functiei getdisk() pentru aflarea
drive-ului curent:
int disk;
disk = getdisk() + A;
printf("Drive-ul curent este: %c\n", disk);
6/30/2014
6
Aflarea directorului curent
Pentru aflarea directorului curent, se poate folosi functia getcurdir(). Daca functia
getcurdir() se executa cu succes returneaza valoare 0. In caz de eroare functia
returneaza valoarea -1.
Functia este declarata astfel:
#include <dir.h>
int getcurdir(int drive, char *nume_director);
unde:
- parametrul drive - specifica un numar de drive si anume: 0 pentru drive-ul implicit,
1 pentru drive-ul A, 2 pentru drive-ul B, 3 pentru drive-ul C si asa mai departe;
- parametrul nume_director - este un pointer de tip sir care specifica numele
directorului care este returnat la apelul functiei getcurdir(); numele nu contine
specificatorul de drive si nu incepe cu un caracter backslash (\).
6/30/2014
7
Urmatorul exemplu, ilustreaza modul de folosire a functiei getcurdir() pentru aflarea
directorului curent:
#include <stdio.h>
#include <string.h>
#include <dir.h>
void main(void)
{int disk;
char nume_dir [64];
disk = getdisk() + 'A';
printf("Drive-ul curent este: %c\n", disk);
strcpy(nume_dir, "\\");
getcurdir (0, nume_dir +1 );
printf("Directorul curent este: %s\n", nume_dir);}
6/30/2014
8
Redirectarea intrarilor si iesirilor in limbajul C
Redirectarea iesirii prin folosirea indicatorului de fisier stdout
Cand se executa o comanda, sistemul de operare Dos sau Unix asociaza dispozitivul
de iesire implicit cu ecranul monitorului. Sistemul de operare face referinta la
monitor ca la dispozitivul standard de iesire sau stdout. Utilizand operatorul de
redirectare a iesirii (>) specific limbajului de comanda al sistemului de operare se
poate indica sistemului de operare sa indrepte iesirea unui program de la ecran catre
un fisier sau catre un alt dispozitiv.
Urmatoarea comanda, de exemplu, cere sistemului Dos sa redirecteze iesirea
comenzii DIR ( care realizeaza afisarea tuturor subdirectoarelor si fisierelor unui
director) de la ecranul monitorului catre fisierul TEST_REDIRECTARE.TXT in
care sunt stocate informatii despre subdirectoarele si informatiile unui director:
C:\> DIR > TEST_REDIRECTARE.TXT <Enter>
Pentru a accepta redirectarea iesirii, limbajul C defineste constanta stdout (in
fisierul antet stdio.h). Constanta stdout poate fi folosita de operatiile de iesire cu
fisiere pentru redirectarea iesirilor, adica pentru modificarea sursei implicite de
iesire.
6/30/2014
9
Redirectarea intrarii prin folosirea indicatorului de fisier stdin
Cand se executa o comanda, sistemul de operare Dos sau Unix asociaza dispozitivul
de intrare implicit cu tastatura calculatorului. Sistemul de operare face referinta la
tastatura ca la dispozitivul standard de intrare sau stdin. Utilizand operatorul de
redirectare a intrarii (<) specific limbajului de comanda al sistemului de operare se
poate indica sistemului de operare sa indrepte intrarea unui program de la tastatura
catre un fisier sau catre un alt dispozitiv.
Urmatoarea comanda, de exemplu, cere sistemului Dos sa redirecteze intrarea
comenzii MORE (care realizeaza afisarea ecran cu ecran a unui fisier) de la tastatura
catre fisierul TEST_DATECC.TXT pe care il afiseaza pe ecran:
C:\> MORE < TEST_DATECC.TXT <Enter>
Pentru a accepta redirectarea intrarii, limbajul C defineste constanta stdin (in
fisierul antet stdio.h). Constanta stdin poate fi folosita de operatiile de intrare cu
fisiere pentru redirectarea intrarilor, adica pentru modificarea sursei implicite de
intrare.
6/30/2014
10
Combinarea redirectarii intrarii si iesirii
Sursele implicite de intrare si de iesire pot fi redirectate in aceeasi comanda.
De exemplu, urmatoarea comanda indica sistemului Dos sa sorteze continutul
fisierului TEST_DATEC.TXT si sa scrie iesirea sortata in fisierul
TEST_DATECC.TXT:
C:\>SORT < TEST_DATEC.TXT > TEST_DATECC.TXT <Enter>
Pentru a intelege procesul executat de sistemul de operare, linia de comanda se va
citi de la stanga catre dreapta. Operatorul de redirectare a intrarii (<) directeaza
intrarea comenzii SORT de la fisierul TEST_DATEC.TXT. In continuare,
operatorul de redirectare a iesirii (>) directeaza iesirea comenzii SORT catre fisierul
TEST_DATECC.TXT .
Utilizarea constantelor stdin si stdout
Programele scrise in limbajul C pot redirecta intrarile si iesirile de la tastatura si
imprimanta catre alte fisiere sau dispozitive prin folosirea indicatorilor de fisier
definiti cu ajutorul constantelor stdin si stdout.
6/30/2014
11
Urmatorul program (redirect_io.cpp) citeste linii de text de la indicatorul de fisier
stdin si converteste textul in majuscule. Apoi, programul scrie liniile de text la
indicatorul de fisier stdout:
#include <stdio.h>
#include <string.h>
void main()
{char sir[256];
char *sir_m;
while (fgets(sir, sizeof(sir), stdin))
{
sir_m = strupr(sir);
fputs(sir_m, stdout);
}}
Comanda REDIRECT_IO se poate folosi cu operatorii de redirectare ai sursei
implicite de intrare si iesire (tastatura si ecranul) astfel:
1. C:\>REDIRECT_IO < TEST_DATEC.TXT - preia datele din intrarea redirectata,
de la stdin la TEST_DATEC.TXT, si afiseaza la ecran datele din acest fisier.
2. C:\>REDIRECT_IO < TEST_DATEC.TXT > TEST_DATECC.TXT - preia
datele din intrarea redirectata, de la stdin la TEST_DATEC.TXT, si scrie datele la
iesirea redirectata, de la stdout la fisierul TEST_DATECC.TXT.
6/30/2014
12
3. C:\>REDIRECT_IO > TEST_DATECC.TXT - preia datele de la tastatura si scrie
datele la iesirea redirectata, de la stdout la fisierul TEST_DATECC.TXT.
4. C:\>REDIRECT_IO - preia datele de la tastatura linie cu linie si le afiseaza pe
ecran cu majuscule tot linie cu linie (deci, la sursele implicite de intrare si iesire).
Pentru a incheia programul, trebuie sa se apese combinatia de taste de sfarsit de fisier,
CTRL+Z (sub Dos) sau CTRL+D (sub Unix).
Operatorul de redirectare pipe (canal de transfer) ( | ) este disponibil in sistemul
de operare Dos si Unix.
Operatorul pipe permite redirectarea iesirii unui program pentru a deveni intrarea altui
program.
De exemplu, urmatoarea comanda indica sistemului de operare Dos sa redirecteze
iesirea comenzii DIR pentru a deveni intrare pentru comanda SORT:
C:\>DIR | SORT <Enter>
Urmatorul exemplu foloseste programul REDIRECT_IO in combinatie cu comanda
Dos FIND. Astfel, programaul REDIRECT_IO redirecteaza intrarea la fisierul
TEST_DATEC.TXT, apoi iesirea din program care este ecranul monitorului
(stdout) devine intrare pentru comanda Dos FIND (care cauta liniile ce contin
cuvantul FISIER):
C:\>REDIRECT_IO < TEST_DATEC.TXT | FIND "FISIER"
6/30/2014
13
Urmatorul program (find_io.cpp) va afisa fiecare aparitie a unui cuvant sau expresie
in cadrul unei intrari redirectate:
#include <stdio.h>
#include <string.h>
main(int argc, char *argv[])
{char sir[256];
if (argc < 2)
{fprintf(stderr, "Utilizare program: %s [cuvant de gasit] <
[nume_fisier]",argv[0]);
return(1);}
else
{
while (fgets(sir, sizeof(sir), stdin))
if (strstr(sir, argv[1]))
fputs(sir, stdout);
return(0);}}
Pentru a afisa fiecare aparitie a cuvantului FREAD in cadrul liniilor fisierului
TEST_DATECCC.TXT se poate invoca programul FIND_IO si apoi comanda
Dos SORT pentru sortarea liniilor gasite, ca mai jos:
C:\>FIND_IO "FREAD" < TEST_DATECCC.TXT | SORT
6/30/2014
14
Prevenirea redirectarii iesirii de la ecranul monitorului
Pentru a preveni redirectarea accidentala a mesajelor de eroare sau a altor mesaje
care trebuie sa apara pe ecran, chiar daca se redirecteaza iesirea, limbajul C foloseste
indicatorul de fisier stderr. Acest indicator de fisier nu poate fi redirectat de la
ecranul monitorului. Atunci cand programul are o iesire redirectata, pentru afisarea
mesajelor de eroare la ecranul monitorului se foloseste functia fprintf() cu
indicatorul de fisier stderr.
Urmatorul program (redirect_io1.cpp) ilustreaza modul de folosire a indicatorului de
fisier stderr:
#include <stdio.h>
#include <string.h>
void main()
{char sir[256];
char *sir_m;
while (fgets(sir, sizeof(sir), stdin))
{
fprintf(stderr, "Pozitia curenta in sursa este octetul %d\n", ftell(stdin));
sir_m = strupr(sir);
fputs(sir_m, stdout);}}
6/30/2014
15
La aplicarea comenzii:
C:\>REDIRECT_IO1 < TEST_DATEC.TXT > TEST_DATECC.TXT
pe ecran se afiseaza:
Pozitia curenta in sursa este octetul 98
Pozitia curenta in sursa este octetul 139
Pozitia curenta in sursa este octetul 155
Pozitia curenta in sursa este octetul 161
Pozitia curenta in sursa este octetul 166
Redirectarea intrarilor si iesirilor in limbajul C++
Limbajul C++ foloseste fluxul de intrare cin care permite redirectarea intrarii de la
tastatura catre un fisier sau catre alt dispozitiv. Fluxul cin corespunde indicatorului de
fisier stdin.
De asemenea, limbajul C++ foloseste fluxul de iesire cout care permite redirectarea
iesirii de la ecran catre un fisier sau catre alt dispozitiv. Fluxul cout corespunde
indicatorului de fisier stdout.
Limbajul C++ foloseste fluxul cerr pentru prevenirea redirectarii iesirii de la ecranul
monitorului. Fluxul cerr corespunde indicatorului de fisier stderr.
6/30/2014
16
Fisiere in limbajul C++
Fluxurile de I/O din C++
Limbajul C++ pune la dispozitie clasa de baza ios (input-output stream) care
defineste operatiile fundamentale de intrare-iesire. Din aceasta clasa de baza limbajul
C++ deriveaza clasele asociate fluxurilor de intrare si de iesire. Fluxurile de intrare si
de iesire sunt definite in cadrul fisierelor antet iostream.h si fstream.h.
Fluxurile de iesire din C++
In cel mai simplu sens, un flux de iesire reprezinta o destinatie a octetilor.
Urmatoarele fluxuri de iesire sunt asociate cu fisierele:
- ostream - utilizat pentru scrierea pe ecran (catre cout si cerr);
- ofstream - utilizat pentru scrierea unui fisier pe disc.
Fluxurile de intrare din C++
In cel mai simplu sens, un flux de intrare reprezinta o sursa de octeti.
Urmatoarele fluxuri de intrare sunt asociate cu fisierele:
- istream - utilizat pentru citirea de la tastatura (de la cin );
- ifstream - utilizat pentru citirea dintr-un fisier de pe disc
6/30/2014
17
Fluxul de intrare/iesire, care este si sursa si destinatie a octetilor, este utilizat atat
pentru citirea dintr-un fisier cat si pentru scrierea intr-un fisier pe disc. Fluxul de
intrare/iesire este declarat cu numele fstream.
Utilizarea manipulatorilor pentru formatarea iesirilor si intrarilor
Manipulatorii sunt comenzi din cadrul fluxurilor de intrare sau de iesire care permit
formatarea intrarilor sau a iesirilor in modul dorit.
Manipulatorii sunt definiti in fisierele antet iostream.h si iomanip.h. Fisierul antet
iomanip.h defineste numai manipulatorii care primesc parametrii. In tabelul de mai
jos sunt descrisi manipulatorii folositi mai des.
Manipulator Utilizare pentru
intrare si/sau iesire
Scop
dec intrare/iesire Indica fluxului sa afiseze/citeasca datele in format
zecimal
hex intrare/iesire Indica fluxului sa afiseze/citeasca datele in format
hexazecimal
oct intrare/iesire Indica fluxului sa afiseze/citeasca datele in format
octal
endl iesire Indica fluxului sa afiseze un caracter de linie noua
si sa se stearga
6/30/2014
18
Manipulator Utilizare pentru
intrare si/sau iesire
Scop
ends iesire Indica fluxului sa afiseze un caracter
NULL
flush iesire Indica fluxului sa se stearga
setbase(int baza) iesire Stabileste baza de numeratie la valoarea
parametrului baza
resetiosflags(long f) intrare/iesire Dezactiveaza indicatoarele de formatare f
(flags) de tip ios specificate
setiosflags(long f) intrare/iesire Activeaza indicatoarele de formatare f
(flags) de tip ios specificate
setfill(int ch) iesire Stabileste caracterul de umplere la
parametrul ch
setprecision(int n) iesire Stabileste precizia la un numar de cifre
dat de parametrul n
setw(int w) iesire Stabileste dimensiunea cu care va fi
afisata o valoare la parametrul w
ws intrare Sare peste ws spatii albe de la inceput
6/30/2014
19
Indicatoarele de formatare (iosflags) de tip ios care pot fi folosite cu manipulatorii
sunt prezentate in continuare.
Definitiile acestor indicatoare de formatare sunt cuprinse in fisierul antet iostream.h.
Indicator de formatare Semnificatie
left Alinierea la stanga a iesirii
right Alinierea la dreapta a iesirii
scientific Utilizeaza notatia de tip 1.2345E2
fixed Utilizeaza notatia de tip 123.45 daca s-a stabilit precizia
la doua zecimale sau 123.450000 daca nu s-a stabilit
precizia in mod explicit
6/30/2014
20
Urmatorul program (setw.cpp) utilizeaza manipulatorul setw pentru a stabili diferite
dimensiuni pentru afisarea diferitelor numere si a unui sir de caractere:
#include <iostream.h>
#include <iomanip.h>
void main(void)
{cout << setw(5) << 1 << endl << setw(6) << 2;
cout << '\n' << setw(7) << 3;
cout << '\n' << setw(8) << 23.345 << endl << setw(5) << 10.2;
cout << '\n' << setw(40) << "Exemplu de dimensionare lungime sir" ;}
Dupa executie, pe ecran se afiseaza urmatoarele:
1
2
3
23.345
10.2
Exemplu de dimensionare lungime sir
6/30/2014
21
Urmatorul program (left_right.cpp) utilizeaza manipulatorul setiosflags cu indicatoarele ios::left si
ios::right pentru a stabili diferite tipuri de alinieri pentru afisarea diferitelor numere si a unui sir de
caractere:
#include <iostream.h>
#include <iomanip.h>
void main(void)
{int i;
cout << "Aliniere stanga\n";
for (i = 0; i < 3; i++)
{cout.width(5);
cout << setiosflags(ios::left) << i;}
cout << '\n' << setw(40) << setiosflags(ios::left) << "Exemplu de aliniere sir la stanga" ;
cout << "\nAliniere dreapta\n";
for (i = 0; i < 3; i++)
{cout.width(5);
cout << setiosflags(ios::right) << i;}
cout << '\n' << setw(40) << setiosflags(ios::right) << "Exemplu de aliniere sir la
dreapta" ;}
Dupa executia programului, pe ecran se afiseaza:
Aliniere stanga
0 1 2
Exemplu de aliniere sir la stanga
Aliniere dreapta
0 1 2
Exemplu de aliniere sir la dreapta
6/30/2014
22
Urmatorul program (setprec.cpp) utilizeaza manipulatorii setprecision si setiosflags
pentru modificarea numarului de zecimale afisate:
#include <iostream.h>
#include <iomanip.h>
void main(void)
{float numar = 1.2345;
int i;
cout << "Numarul neformatat" << endl;
cout << numar << endl;
cout << "Numarul formatat la precizia implicita de 6 zecimale" << endl;
cout << setiosflags(ios::fixed) << numar << endl;
for (i = 0; i < 4 ;i++)
{cout << "Numarul formatat cu " << i << " zecimale" << endl;
cout << setprecision (i) << setiosflags(ios::fixed) << numar << endl;}}
Nota: Din exemplul ilustrat rezulta ca in aceasta implementare (Borland C++ 5.0) cei
doi manipulatori trebuie sa fie folositi impreuna, adica intai se precizeaza numarul de
zecimale dorite, prin manipulatorul setprecision (i), si apoi se seteaza indicatorul de
formatare fixed cu ajutorul manipulatorului setiosflags.
6/30/2014
23
Dupa executie, pe ecran se afiseaza urmatoarele:
Numarul neformatat
1.2345
Numarul formatat la precizia implicita de 6 zecimale
1.234500
Numarul formatat cu 0 zecimale
1
Numarul formatat cu 1 zecimale
1.2
Numarul formatat cu 2 zecimale
1.23
Numarul formatat cu 3 zecimale
1.235
6/30/2014
24
In mod implicit, atunci cand se utilizeaza un flux de iesire cu manipulatorul setw,
pentru specificarea umplerii cu caractere, daca dimensiunea este mai mare decat a
numarului sau a sirului de caracter specificat, C++ utilizeaza caracterul spatiu
pentru a umple spatiile suplimentare. Prin utilizarea manipulatorului setfill se pot
specifica diferite caractere de umplere pentru fluxul de iesire.
Urmatorul program (setfill.cpp)
#include <iostream.h>
#include <iomanip.h>
void main(void)
{int i;
for (i = 0; i < 4; i++)
{cout << setfill('.') << setw(5 + i) << i << '\n';}}
Dupa executia programului, pe ecran se afiseaza:
....0
.....1
......2
.......3
6/30/2014
25
Declararea fisierelor in C++
Asa cum s-a precizat, limbajul C++ pune la dispozitie fluxurile de fisier ifstream,
ofstream si fstream (de intrare, de iesire si de intrare/iesire).
Pentru a utiliza intr-un program operatii de intrare/iesire folosind fisiere trebuie sa se
declare variabile de tipurile ifstream, ofstream sau fstream, astfel:
ifstream f_i; // se declara un flux de intrare denumit f_i
ofstream f_o; // se declara un flux de iesire denumit f_o
fstream f_io // se declara un flux de intrare si de iesire denumit f_io
Observatii:
1. Declaratiile precedente respecta sintaxa declaratiilor de variabile si anume:
ifstream, ofstream si fstream reprezinta tipul, iar f_i, f_o si f_io reprezinta numele
variabilelor. Tipul insa este o clasa de obiecte, iar variabilele f_i, f_o, f_io sunt
obiecte propriu-zise ale acelei clase.
2. O clasa de obiecte este asemanatoare tipului struct, dar clasa contine atat date, cat
si functiile necesare prelucrarii acestora. Datele si functiile incluse intr-o clasa se
numesc membri.Variabilele de tip clasa se numesc obiecte. Pentru a se face referire
la un membru al unui obiect se utilizeaza operatorul punct (.), denumit operator de
selectie directa, astfel: <nume_obiect>.<nume_membru>
6/30/2014
26
Deschiderea fisierelor in C++
Pentru a utiliza fluxul (stream-ul) declarat trebuie ca acesta sa fie deschis. La
deschidere se asociaza fluxul cu un fisier fizic (existent pe suport extern) si, eventual,
se precizeaza modul de deschidere, care determina operatiile permise cu fisierul
respectiv.
Deschiderea se poate realiza in doua moduri:
- dupa declararea variabilei de tip flux, prin apelul functiei membru open, precizand
ca parametrii un sir de caractere, care reprezinta specificatorul fisierului fizic,
conform sistemului de operare utilizat si (eventual) modul de deschidere;
- la declarare, specificand, dupa numele fluxului care se declara, numai parametrii
corespunzatori functiei membru open, incadrati intre paranteze rotunde.
Nota: La deschidere, este obligatoriu sa se specifice modul de deschidere daca
fisierul este declarat de tip fstream. Pentru tipul ifstream se utilizeaza, implicit,
modul ios::in, iar pentru tipul ofstream se utilizeaza, implicit, modul ios::out.
6/30/2014
27
Modurile de deschidere permise in C++ sunt descrise in tabelul de mai jos.
Modul de
deschidere
Semnificatie
ios::app Deschide un fisier in mod adaugare
ios::ate Deschide un fisier fie pentru citire, fie pentru scriere, mutand
pointerul de fisier la sfarsitul lui
ios::in Deschide un fisier pentru citire
ios::out Deschide un fisier pentru scriere
ios::nocreate Deschide un fisier numai daca el exista deja
ios::noreplace Deschide un fisier numai daca el nu a fost creat deja
ios::trunc Truncheaza un fisier existent
ios::binary Deschide un fisier in mod binar
Exemplul 1:
ifstream f_i; sau ifstream f_i (test.dat);
f_i.open (test.dat);
6/30/2014
28
Exemplul 2:
ofstream f_o; sau ofstream f_o (test.dat);
f_o.open (test.dat);
Exemplul 3:
fstream f_io; sau fstream f_io (test.dat, ios::in);
f_io.open (test.dat, ios::in);
Exemplul 4:
fstream f_io; sau fstream f_io (test.dat, ios::out);
f_io.open (test.dat, ios::out);
Exemplul 5:
fstream f_io;
f_io.open (test.dat, ios::in | ios::binary);
sau
f_io.open (test.dat, ios::out | ios::binary);
6/30/2014
29
Observatie: Daca dupa operatia de deschidere a fisierului variabila-flux
corespunzatoare are valoarea NULL, atunci se deduce ca operatia de deschidere a
esuat (de exemplu, daca dorim sa deschidem un fisier de intrare care nu exista). De
aceea, este necesar sa se testeze succesul operatiei de deschidere inainte de a efectua
orice alta operatie cu fisierul.
Testarea starii unei operatii I/O cu fisiere
Pentru a determina daca o operatie de deschidere, citire sau scriere a unui fisier a
reusit se pot utiliza functiile membre ale fluxurilor ifstream, ofstream si fstream,
descrise in tabelul de mai jos.
Functii
membre
Exemplu Semnificatie
bad <flux>.bad() Returneaza o valoare diferita de zero daca operatia de I/O
intalneste o eroare ireparabila
fail <flux>.fail() Returneaza o valoare diferita de zero daca operatia de I/O
intalneste o eroare reparabila sau previzibila, cum ar fi un
fisier care nu a fost gasit
good <flux>.good() Returneaza o valoare diferita de zero daca operatia de I/O a
reusit
eof <flux>.eof() Returneaza o valoare diferita de zero daca operatia de I/O
intalneste sfarsitul de fisier
6/30/2014
30
Inchiderea unui fisier deschis
Dupa realizarea tuturor operatiilor cu un fisier, acesta trebuie inchis. Inchiderea unui
fisier se realizeaza prin apelarea unei functii membre a fluxului respectiv si anume
close().
De exemplu:
f_i.close() sau f_o.close()
Operatia de inchidere este obligatorie, in special pentru fisierele de iesire.
Citirea si scrierea datelor in fluxurile de fisiere
Utilizarea functiilor membre read si write
Pentru citirea datelor dintr-un flux de fisier se poate folosi functia membru read a
clasei istream. Formatul functiei read este:
#include <iostream.h>
#include <fstream.h>
istream &read (unsigned char *buffer, int nr_octeti);
Functia membru read citeste un numar de octeti (dat de parametrul nr_octeti) din
fluxul de intrare. Apoi plaseaza acesti nr_octeti in bufferul de memorie care incepe la
adresa indicata de parametrul buffer.
6/30/2014
31
Pentru scrierea datelor intr-un flux de fisier se poate folosi functia membru write
a clasei ostream.
Formatul functiei write este:
#include <iostream.h>
#include <fstream.h>
ostream &write (const unsigned char *buffer, int nr_octeti);
Functia membru write scrie la fluxul de iesire numarul de octeti specificat de
parametrul nr_octeti, incepand de la locatia de memorie indicata de parametrul
buffer.
Nota: Functiile membre read si write pot fi folosite pentru citirea datelor de tip text
sau binare.
Urmatorul program (flux_rw_text.cpp) utilizeaza functiile membre read si write
pentru a copia un fisier de tip text, citind din fluxul de fisier caracter cu caracter.
6/30/2014
32
#include <iostream.h>
#include <fstream.h>
main()
{char caracter[1];
ifstream intrare("test_date.txt", ios::in);
if (intrare.fail())
{cout << "Eroare la deschiderea fisierului ";
return(1);}
ofstream iesire("test_datec.txt", ios::out);
if (iesire.fail())
{cout << "Eroare la deschiderea fisierului ";
return(1);}
do
{
intrare.read(caracter, sizeof(caracter));
if (intrare.good())
iesire.write(caracter, sizeof(caracter));
} while (! intrare.eof());
intrare.close();
iesire.close();
return (0);
}
6/30/2014
33
Urmatorul program (flux_rw_bin.cpp) utilizeaza functiile membre read si write
pentru a copia un fisier de tip binar.
#include <iostream.h>
#include <fstream.h>
main()
{char caracter[1];
ifstream intrare("functia_abs.exe", ios::in | ios::binary);
if (intrare.fail())
{cout << "Eroare la deschiderea fisierului ";
return(1);}
ofstream iesire("functia_abs1.exe", ios::out | ios::binary);
if (iesire.fail())
{cout << "Eroare la deschiderea fisierului ";
return(1);}
do
{intrare.read(caracter, sizeof(caracter));
if (intrare.good())
iesire.write(caracter, sizeof(caracter));} while (! intrare.eof());
intrare.close();
iesire.close();
return (0);}
6/30/2014
34
Urmatorul program (r_w_struct.cpp) utilizeaza functiile membre read si write pentru
a scrie o structura pe disc si apoi pentru a o citi si afisa.
#include <iostream.h>
#include <fstream.h>
#include <string.h>
#include <iomanip.h>
struct stare
{ char nume[20];
float balanta;
unsigned long nr_cont;};
main(void)
{ struct stare cont;
struct stare *pcont;
int n, i;
ofstream outbal("cont.asc", ios::out | ios::binary);
if(!outbal)
{cout << "Eroare la deschiderea fisierului" << endl;
return (1);}
cout <<"Introduceti numarul de persoane "; cin >> n;
6/30/2014
35
cout << "Introduceti informatiile despre conturile bancare\n";
for (i=0; i<n; i++)
{ cout <<"Numele si prenumele: "; cin.get();
cin.getline (cont.nume, 20);
cout << "Continut cont: lei "; cin >> cont.balanta;
cout << "Numar cont: "; cin >> cont.nr_cont;
pcont = &cont;
outbal.write((unsigned char *) pcont, sizeof(struct stare));}
outbal.close();
ifstream inbal("cont.asc", ios::in | ios::binary);
if(!inbal)
{ cout << "Eroare la deschiderea fisierului" << endl;
return(1);}
do
{inbal.read((unsigned char*) &cont, sizeof(struct stare));
if (!inbal.eof())
{cout << cont.nume << endl;
cout << "Numarul contului: " << cont.nr_cont << endl;
cout << "Continut cont: lei " << setprecision(2)<< setiosflags (ios::fixed)
<< cont.balanta << endl;}
} while (!inbal.eof());
inbal.close();
return (0);}
6/30/2014
36
Utilizarea functiilor membre get () supraincarcate pentru citirea datelor dintr-
un fisier
Functia get () este membra a clasei istream si poate fi utilizata in doua variante
supraincarcate.
Formatele functiei get() sunt:
#include <iostream.h>
#include <fstream.h>
istream &get (char *buffer, int nr_car, char delim = \n);
int get(void);
Prima functie get() supraincarcata citeste caractere in sirul de caractere dat de
parametrul buffer. Functia citeste pana cand: fie s-a depasit numarul de caractere din
parametrul nr_car, fie intalneste caracterul specificat de parametrul delim. Functia
nu scoate din flux caracterul delimitator.
Cea dea doua functie get () supraincarcata returneaza caracterul citit ca pe o valoare
intreaga. Ea va returna constanta EOF daca intalneste marcajul de sfarsit de fisier.
Observatie: Pentru scrierea unui caracter intrun fisier se poate folosi functia put()
invatata deja.
6/30/2014
37
Utilizarea functiei membre getline () pentru citirea datelor dintr-un fisier linie
cu linie
Formatele functiei get() sunt:
#include <iostream.h>
#include <fstream.h>
istream &getline (char *buffer, int nr_car, char delim = \n);
Functia getline () este identica primei variante de functie get() supraincarcata.
Determinarea pozitiei curente (pointerului de pozitie) dintr-un flux de
fisier
Pentru determinarea pozitiei curente dintr-un flux (pointerului de pozitie) se poate
folosi functiile membre tellg si tellp. Functia tellg() se foloseste cu fluxuri de
intrare, iar tellp() se foloseste cu fluxuri de iesire
Formatul acestor doua functii este:
#include <iostream.h>
#include <fstream.h>
long intrare.tellg(void);
long iesire.tellp(void);
6/30/2014
38
Setarea pozitiei pointerului de pozitie dintr-un flux de fisier
Pentru a muta pointerul de pozitie la o locatie dorita in fisier se pot utiliza functiile
seekg (pentru fluxuri de intrare) si seekp (pentru fluxuri de iesire).
#include <iostream.h>
#include <fstream.h>
istream &seekg (streamoff deplasament [, seek_dir origine]);
ostream &seekp (streamoff deplasament [, seek_dir origine]);
unde:
- parametrul deplasament - precizeaza numarul de octeti de deplasament;
- parametrul origine - precizeaza locatia (octetul) din fisier de la care trebuie sa se
aplice deplasamentul; daca nu se precizeaza deplasamentul se aplica de la inceputul
fisierului.
Parametrul origine poate lua urmatoarele valori:
- beg - locatia de inceput a fisierului;
- cur - locatia curenta in fisier;
- end - locatia de sfarsit a fisierului.
6/30/2014
39
Urmatorul program (functia_seek_tel.cpp) ilustreaza modul de folosire a functiilor
tellp si seekp pentru a se face salturi la diferite locatii dintr-un fisier in scopul
inlocuirii unui caracter din fisier cu un altul specificat. De asemenea se afiseaza si
pozitia curenta in fisier. Programul foloseste un flux de tip fstream.
#include <iostream.h>
#include <fstream.h>
main()
{char caracter;
long octet;
cout << "Introduceti locatia din fisier" << '\n' << "in care doriti inlocuirea ";
cin >> octet;
cout << "Introduceti caracterul de inlocuit "; cin >> caracter;
fstream iesire("test_date.txt", ios::in | ios::out | ios::binary);
if(!iesire)
{cout << "Fisierul nu poate fi deschis";
return(1);}
iesire.seekp(octet, ios::beg);
iesire.put(caracter);
cout << "Pozitia curenta este: " << iesire.tellp() << endl;
iesire.close();
return (0);}
6/30/2014
40
Utilizarea operatorului de citire >> si a operatorului de scriere <<
pentru citirea si scrierea datelor intr-un fisier
Operatorul de citire >> se foloseste in acelasi mod cu citirea de la fluxul cin. Una
dintre particularitatile citirii cu operatorul >> este faptul ca ignora caracterele albe.
Prin urmare, daca se doreste sa se citeasca toate caracterele din fisier (inclusiv
spatiul, Tab, Enter) acest mod de citire este inadecvat.
Exemplu de citire cu operatorul >> se prezinta in secventa de cod de mai jos:
ifstream intrare (test.dat);
int n;
intrare >> n;
Operatorul de scriere << se foloseste in acelasi mod cu scrierea de la fluxul cout.
Exemplu de scriere cu operatorul << se prezinta in secventa de cod de mai jos:
ofstream iesire (test.dat);
iesire << Am scris in fisier

S-ar putea să vă placă și